我自己解决了这个问题,但是我花了很长时间才发现这样一个简单的解决方案,我认为它应该在这里记录下来。
我有一个带有 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>
我的 Controller 中有一个非常简单的处理程序方法,但在本示例中我对其进行了进一步简化:
@RequestMapping("/groups")
public String selectGroup() {
return "redirect:/";
}
问题是,如果我浏览到 https://my.domain.com/groups
,我最终会访问 http://my.domain.com/
重定向后。 (实际上,我的负载均衡器将所有 http 请求重定向到 https,但这只会导致打开此类警报的人出现多个“您正在离开/进入安全连接”类型的浏览器警报。)
所以问题是:当原始请求使用的是 https 时,如何让 spring 重定向到 https?
最佳答案
简短的回答是,将 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 中都观察到了这个问题和码头。)
关于Spring MVC "redirect:"前缀总是重定向到 http——我如何让它保持在 https 上?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3401113/