在给网站增加https之后,发现了一个重定向的问题。
网站架构:nginx做代理,应用端使用docker做一个个不同的后端服务。在nginx层安装ssl证书。
问题:在https下访问网站https://www.3kkg.com/admin如果这时候没有登陆,则会重定向到登录页面即https://www.3kkg.com/login,但是目前的问题是,跳转到了http加端口的地址即http://www.3kkg.com:443/admin这个时候使用的是http协议,但是又指定了443端口。结果直接报错。
解决办法:
一:直接使用forward的形式跳转
缺点:改变业务,不太建议。
二:重定向代码修改成如下形式:
httpServletResponse.setStatus(302); httpServletResponse.setHeader("location", httpServletRequest.getContextPath()+"/login")
三:使用spring mvc实现的重定向即:"redirect:/login"仍然会失败
这个时候需要修改mvc的配置把viewResolver的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>
但是我使用的是springboot+jfinal的enjoy作为视图模板。在yml文件中找不到这个配置,于是只能从代码端解决。一下是enjoy的代码段配置(有删减)
@Configuration public class EnjoyConfig { @Bean public JFinalViewResolver jFinalViewResolver() { JFinalViewResolver jfr = new JFinalViewResolver(); jfr.setSessionInView(true); jfr.setRedirectHttp10Compatible(false); return jfr; } }
使用综上3种方法配合使用,问题解决。
参考资料:
https://blog.csdn.net/zhuye1992/article/details/80496151
https://blog.csdn.net/successli1994/article/details/82658176