java - Spring @RequestMapping 重定向到带有附加信息的相同路径

标签 java spring spring-mvc spring-boot microservices

这可能是一个有点不寻常的场景,但我们需要在 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/

相关文章:

spring - Spring Data Elasticsearch Repository查询定义日期输入参数格式

Spring 异常处理程序 - 处理多个异常

java - Spring MVC : Receive radio button values

java - 为什么会/应该允许这样做?

java :direct gmail url

java - 在 JSON 配置文件中注入(inject) Spring Boot 应用程序属性

java - Spring 国际化中的动态名称

spring-mvc - Spring MVC 拦截器不会为资源处理程序 URL 执行

Java:替代 LinkedList 或 int 指针数据结构

java - 验证队列消息