2015-04-23 95 views
0

一个不同寻常的场景也许,但我们需要在Spring MVC控制器重定向:春@RequestMapping重定向到相同的路径与其他信息

/js/hal-browser/browser.html 

到:

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

我所有的尝试迄今为止的解决方案导致了一个重定向循环,因为Spring执行重定向,但是随后在重定向URL中重复匹配/browser.html,而不管其他信息如何。我需要说的是'只有在匹配路径的末尾时才匹配/browser.html'。

我曾尝试在PathMatchConfigurersetUseSuffixPatternMatch(Boolean.FALSE);无果,也试过以下URI模板正则表达式模式在请求映射本身:

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

..但仍然获得了重定向循环。理念赞赏 - 这是SpringBoot 1.2.3微服务中的Spring 4.1.6,通过上下文。

更新: 在进一步的调查,并更好地理解在由HAL浏览器使用,以确定URL片段的哪条路径就会使一个请求到微服务本身,我相信该解决方案可以在尽量不说谎重定向browser.html,因为Spring会将其映射到每个请求上的相同控制器方法而不管片段值如何,而是恢复为HAL浏览器设置为默认条目的应用程序的默认上下文路径(/)或者找到一种方法来配置嵌入式tomcat容器,以便在默认上下文路径上响应某些合理的(不仅仅是404)响应,即使应用映射到/ some_path。

作为进一步的上下文,我们可以根据/browser(或其他)的便利路径将任何问题都重定向到HAL浏览器,并将正确的入口点片段作为服务的上下文路径 - 工作正常。问题是浏览器本身有一个'Go to entry point'按钮,当它作为webjar被拉入时,它被硬编码为/。另一种选择是放弃webjar,只需复制浏览器的静态文件并更新入口点。

+4

'#'是一个特殊的字符,永远不会发送到服务器,服务器只能看到之前的部分。 –

+1

你真的需要在服务器上执行这种重定向吗?你不能简单地在JavaScript中添加'#/ some_path /'到位置吗? – axtavt

+0

@axtavt - 不容易,因为hal浏览器被拉入作为webjar(否则是,这将是直截了当) –

回答

2

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

你可以做的就是在你的控制器中添加自定义标题,让你的控制器拦截只有在头不存在使用headers属性的否定代码,这里是一个伪代码

@RequestMapping(value=[YOUR MAPPING], method=RequestMethod.GET, headers="!CustomHeader") 
+0

感谢您的建议,我可以看到逻辑,但问题仍然存在,因为片段没有发送到服务器我们正在有效地重定向到相同的路径,虽然我们可以应用过滤器来添加自定义标头,但它将应用于原始请求和重定向。再看一遍,这个问题实际上有一个单独的原因,无论如何,应用程序的上下文路径从默认和HAL浏览器在默认情况下查看'/'相关。感谢您的想法,但肯定是一种记住未来的方法:-) –

1

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

window.location.hash="/some_path/"; 
+0

感谢您的建议@ninj,我可以看到这可能在某些情况下工作,但问题归结为服务器将永远不会看到片段'/ some_path /',因此在将控制器方法映射到'/ js/hal-browser/browser.html'并返回ether重定向或JS片段时,每次请求进入HAL浏览器资源,而不管浏览器位于哪个“路径”。 –

相关问题