这可能是一个有点不寻常的场景,但我们需要在 Spring MVC Controller 中重定向:
/js/hal-browser/browser.html
至:
/js/hal-browser/browser.html#/some_path/
迄今为止,我尝试的所有解决方案都导致了重定向循环,因为 Spring 执行重定向,但随后重复匹配重定向 URL 中的/browser.html,而不管附加信息如何。我需要说的是“仅当它是路径的末尾时才匹配/browser.html”。
我在 PathMatchConfigurer
上尝试了 setUseSuffixPatternMatch(Boolean.FALSE);
无济于事,还在请求映射本身中尝试了以下 URI 模板正则表达式模式:
"/js/hal-browser/{file:browser\\.html$}"
..但仍然会出现重定向循环。感谢您的想法 - 根据上下文,这是 SpringBoot 1.2.3 微服务中的 Spring 4.1.6。
更新:
通过进一步调查和更好地理解 HAL 浏览器使用的 URL 片段来确定它将在微服务本身内向哪个路径发出请求,我相信解决方案可能不在于尝试重定向 browser.html
,因为 Spring 会在每个请求上将其映射到相同的 Controller 方法,而不管片段值如何,而是恢复到应用程序的默认上下文路径 (/
),即 HAL浏览器已设置为其默认入口点,或者找到一种方法来配置嵌入式 tomcat 容器,以在默认上下文路径上响应一些合理的内容(而不仅仅是 404),即使应用程序映射到/some_path。
作为进一步的上下文,我们可以毫无问题地从 /browser
(或其他)的便捷路径重定向到 HAL 浏览器,并使用正确的入口点片段作为服务的上下文路径 -效果很好。问题是浏览器本身有一个“转到入口点”按钮,当将其拉入时 webjar ,被硬编码为 /
。另一种选择是放弃 webjar,只复制浏览器的静态文件并更新入口点。
最佳答案
#
之后的部分永远不会发送到服务器,因此在这种情况下,您将始终在循环中收到相同的请求。
您可以做的是在 Controller 中添加自定义 header ,并通过使用 headers
属性的否定使 Controller 仅拦截 header 不存在的代码,这是一个伪代码
@RequestMapping(value=[YOUR MAPPING], method=RequestMethod.GET, headers="!CustomHeader")
关于java - Spring @RequestMapping 重定向到带有附加信息的相同路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29821391/