【问题标题】:Spring @RequestMapping redirect to same path with additional infoSpring @RequestMapping 重定向到具有附加信息的相同路径
【发布时间】:2015-07-01 12:25:02
【问题描述】:

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

/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无论片段值如何,都会在每个请求上将其映射到相同的控制器方法,而是恢复到 HAL 浏览器已设置为其默认入口点的应用程序的默认上下文路径 (/),或者找到一个配置嵌入式 tomcat 容器以在默认上下文路径上以合理的内容(不仅仅是 404)响应的方法,即使应用程序映射到 /some_path。

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

【问题讨论】:

  • # 是一个特殊字符,永远不会发送到服务器,服务器只会看到之前的部分。
  • 你真的需要在服务器上执行这种重定向吗?您不能简单地将#/some_path/ 添加到 JavaScript 中的位置吗?
  • @axtavt - 不容易,因为 hal-browser 作为 webjar 被拉入(否则它会很简单)

标签: java spring spring-mvc spring-boot microservices


【解决方案1】:

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

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

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

【讨论】:

  • 感谢您的建议,我可以看到逻辑,但问题仍然存在,因为片段没有发送到服务器,我们实际上是重定向到相同的路径,虽然我们可以应用过滤器来添加自定义标头,它将应用于原始请求和重定向。再次查看后,问题实际上有一个稍微不同的原因,与应用程序的上下文路径从默认更改和 HAL 浏览器默认查看“/”有关。不过,感谢您的想法,当然是一种为未来牢记的方法:-)
【解决方案2】:

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

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

【讨论】:

  • 感谢@ninj 的建议,我可以看到这在某些情况下是如何工作的,但是问题再次归结为服务器永远不会看到片段/some_path/ 所以在映射/js/hal-browser/browser.html 的控制器方法并返回以太重定向或您的 JS sn-p,每次请求 HAL 浏览器资源时都会发生这种情况,无论浏览器在哪个“路径”上。
猜你喜欢
  • 1970-01-01
  • 2016-10-07
  • 1970-01-01
  • 2012-02-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-16
  • 2016-10-20
相关资源
最近更新 更多