我自己解决了这个问题,但我花了很长时间才发现这样一个简单的解决方案,我认为它值得记录在这里。
我有一个带有 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 许可协议
简短的回答是,将 InternalResourceViewResolver 的 redirectHttp10Compatible 属性设置为 false:
您可以在每个请求的基础上执行此操作,方法是让您的处理程序方法返回 View 而不是 String,然后自己创建 RedirectView,然后调用
setHttp10Compatible(false)
。(事实证明,罪魁祸首是 HttpServletResponse.sendRedirect,RedirectView 将其用于与 HTTP 1.0 兼容的重定向,但并非如此。我想这意味着它取决于您的 servlet 容器的实现(?);我在 Tomcat 和 Jetty 中都观察到了这个问题。 )