我自己解决了这个问题,但是花了很长时间才发现这样一个简单的解决方案,所以我认为应该在此处进行记录。
我有一个带有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://my.domain.com/groups
http://my.domain.com/
所以问题是:当原始请求使用的是那种方法时,如何使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)。
setHttp10Compatible(false)
(原来的罪魁祸首是HttpServletResponse.sendRedirect,RedirectView用于HTTP 1.0兼容的重定向,但不是这样。我想这意味着它取决于您的servlet容器的实现(?);我在Tomcat和Jetty中都观察到了这个问题。 )