当前位置:  开发笔记 > 后端 > 正文

Spring MVC"redirect:"前缀总是重定向到http - 如何让它保持在https?

如何解决《SpringMVC"redirect:"前缀总是重定向到http-如何让它保持在https?》经验,为你挑选了4个好方法。

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

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


  
  
  

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

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

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

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



1> super_aardva..:

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


  
  
  
  

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

(事实证明,罪魁祸首是HttpServletResponse.sendRedirect,RedirectView用于HTTP 1.0兼容重定向,但不是.我想这意味着它依赖于你的servlet容器的实现(?);我在Tomcat和Jetty中都观察到了这个问题. )


这对我也有用,在Spring Boot @Configuration类中,我只是做了“ this.thymeleafViewResolver.setRedirectHttp10Compatible(false);”。我的application.properties文件中已经有tomcat标头,我也需要它们,但是它们并没有成功。现在,我的应用程序返回带有相对URL的303,而不是带有绝对URL的302。我使用的是Spring 4的Spring Boot 1.5.14,也许这种行为在较新的版本中发生了变化?

2> 小智..:

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

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

这对我来说,可以在https负载均衡器后面将未更改的spring-boot-sample-web-ui部署到Elastic Beanstalk.没有这些属性,MessageController默认情况下第68行的重定向为http并挂起.

希望这可以帮助.


谢谢.这有助于我的应用程序支持负载均衡器.配置参数略有改变.server.tomcat.remote-ip-header = x-forwarded-for server.tomcat.protocol-header = x-forwarded-proto

3> Albert Bos..:

对我有用的是将其添加到application.properties server.tomcat.use-relative-redirects=true

因此,当您拥有:

public function redirect() {
  return "redirect:/"
}

如果没有,server.tomcat.use-relative-redirects它将添加一个Location标题,例如:http://my-host.com/。随着server.tomcat.use-relative-redirects它的样子:/。因此从浏览器角度来看,它将相对于当前页面。



4> Janning..:

你确定吗?

看代码似乎没有区别.两种变体都调用response.encodeRedirectURL(targetUrl),参见RedirectView的第388行:

if (http10Compatible) {
    // Always send status code 302.
    response.sendRedirect(response.encodeRedirectURL(targetUrl));
}
else {
    HttpStatus statusCode = getHttp11StatusCode(request, response, targetUrl);
    response.setStatus(statusCode.value());
    response.setHeader("Location", response.encodeRedirectURL(targetUrl));
}

我遇到了同样的问题,但它是通过在负载均衡器后面设置tomcat来触发的.负载均衡器执行SSL握手并转发到tomcat一个普通的http连接.

解决方案是在Loadbalancer中发送一个特殊的Http Header,这样tomcat就可以"信任"这个连接.使用servlet过滤器应设置response.isSecure标志.然后覆盖RedirectView以查看response.isSecure是否以正确的方式处理它.

我保持这个解决方案的简短,因为我不确定它是否能解决这个问题.

推荐阅读
mobiledu2402851173
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有