Spring MVC“redirect:”前缀总是重定向到 http——如何让它保持在 https 上?

新手上路,请多包涵

我自己解决了这个问题,但我花了很长时间才发现这样一个简单的解决方案,我认为它值得记录在这里。

我有一个带有 InternalResourceViewResolver 的典型 Spring 3 MVC 设置:

 <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
  <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />
  <property name="prefix" value="/" />
  <property name="suffix" value=".jsp" />
</bean>

我的控制器中有一个非常简单的处理程序方法,但我为这个示例进一步简化了它:

 @RequestMapping("/groups")
public String selectGroup() {
    return "redirect:/";
}

问题是,如果我浏览到 https://my.domain.com/groups ,我最终会在 http://my.domain.com/ 重定向后。 (实际上,我的负载均衡器将所有 http 请求重定向到 https,但这只会导致打开此类警报的人们出现多个类型为“您正在离开/进入安全连接”的浏览器警报。)

所以问题是:当原始请求使用的是 https 时,如何让 spring 重定向到 https?

原文由 super_aardvark 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 2k
2 个回答

简短的回答是,将 InternalResourceViewResolver 的 redirectHttp10Compatible 属性设置为 false:

 <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
  <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />
  <property name="prefix" value="/" />
  <property name="suffix" value=".jsp" />
  <property name="redirectHttp10Compatible" value="false" />
</bean>

您可以在每个请求的基础上执行此操作,方法是让您的处理程序方法返回 View 而不是 String,然后自己创建 RedirectView,然后调用 setHttp10Compatible(false)

(事实证明,罪魁祸首是 HttpServletResponse.sendRedirect,RedirectView 将其用于与 HTTP 1.0 兼容的重定向,但并非如此。我想这意味着它取决于您的 servlet 容器的实现(?);我在 Tomcat 和 Jetty 中都观察到了这个问题。 )

原文由 super_aardvark 发布,翻译遵循 CC BY-SA 2.5 许可协议

如果你在代理服务器后面运行,Spring Boot 提供了 这个很好的基于配置的解决方案,只需将这两个属性添加到你的 application.properties 文件中:

 server.tomcat.remote_ip_header=x-forwarded-for
server.tomcat.protocol_header=x-forwarded-proto

这对我来说很有效,可以将原本不变 的 spring-boot-sample-web-ui 部署到 https 负载均衡器后面的 Elastic Beanstalk。如果没有这些属性, MessageController 第 68 行的重定向默认为 http 并挂起。

希望这可以帮助。

原文由 tankthinks 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题