0

可能是一个有点不寻常的场景,但我们需要在 Spring MVC 控制器中重定向:

/js/hal-browser/browser.html

至:

/js/hal-browser/browser.html#/some_path/

迄今为止,我尝试的所有解决方案都导致了重定向循环,因为 Spring 执行重定向,但随后在重定向 URL 中重复匹配 /browser.html,而不管附加信息如何。我需要说的是“仅当它是路径的结尾时才匹配/browser.html”。

我尝试过setUseSuffixPatternMatch(Boolean.FALSE);无济于事PathMatchConfigurer,还在请求映射本身中尝试了以下 URI 模板正则表达式模式:

"/js/hal-browser/{file:browser\\.html$}"

..但仍然得到一个重定向循环。想法赞赏 - 这是 SpringBoot 1.2.3 微服务中的 Spring 4.1.6,通过上下文。

更新: 在进一步调查和更好地理解 HAL 浏览器使用的 URL 片段以确定它将在微服务本身内向哪个路径发出请求时,我相信解决方案可能不在于尝试重定向 off browser.html,因为 Spring 会无论片段值如何,都将其映射到每个请求的相同控制器方法,而是恢复到/HAL 浏览器已设置为其默认入口点的应用程序 ( ) 的默认上下文路径,或者找到一种方法来配置即使应用程序映射到 /some_path,嵌入式 tomcat 容器也会在默认上下文路径上响应一些合理的内容(不仅仅是 404)。

作为进一步的上下文,我们可以毫无问题地从便捷路径/browser(或其他路径)重定向到 HAL 浏览器,并使用正确的入口点片段作为服务的上下文路径——效果很好。问题是浏览器本身有一个“转到入口点”按钮,当将其作为webjar拉入时,该按钮被硬编码为/. 另一种选择是放弃 webjar,只复制浏览器的静态文件并更新入口点。

4

2 回答 2

2

之后的部分#将永远不会发送到服务器,因此在这种情况下,您将始终在循环中收到相同的请求。

您可以做的是在您的控制器中添加一个自定义标头,并通过使用headers属性的否定使您的控制器仅拦截标头不存在的代码,这是一个伪代码

@RequestMapping(value=[YOUR MAPPING], method=RequestMethod.GET, headers="!CustomHeader")
于 2015-04-23T11:02:41.773 回答
1

您可以尝试不重定向用户,而是使用一些 javascript 发回您想要的内容,以使客户端浏览器在加载后跳转到锚点,例如:

window.location.hash="/some_path/";
于 2015-04-23T22:44:39.623 回答