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,但这对于那些已打开此类警报的人来说,只会导致多个浏览器警报,类型为“您正在离开/进入安全连接”。)

所以问题是:当原始请求使用的是那种方法时,如何使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和Jetty中都观察到了这个问题。 )