问题描述
网站是https的,但是使用了HttpServletResponse.sendRedirect的方法,设置的相对路径的地址跳转到了http网址(80端口),而不是https(443端口)。
这会导致很多问题,如
1.用户一次请求,结果多次才能访问上,影响体验
2.http被访问,其实不希望被访问到
3.被安全的浏览器认为你在反复重定向,可能直接kill你的请求
解决方案
ps:推荐使用第二种
1.redirect的时候强制加上https
不推荐这种,不通用。面向对象的解决方式
2.使用spring的设置 将redirectHttp10Compatible属性设为false
推荐使用这种,不需要撸代码,直接配置即可。优雅不失风度,请直接拷走 不谢
<!-- redirectHttp10Compatible:解决https环境下使用redirect重定向地址变为http的协议,设置为false,即关闭了对http1.0协议的兼容支持
<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>
3.写一个过滤器处理HttpServletResponse.sendRedirect,强制加上https
通过HttpServletResponseWrapper可以通过Filter拦截SendRedirect请求并固定跳转到HTTPS,下面是核心代码
web.xml
<filter>
<filter-name>AbsoluteSendRedirectFilter</filter-name>
<filter-class>com.jamel.core.filter.AbsoluteSendRedirectFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>AbsoluteSendRedirectFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
AbsoluteSendRedirectFilter.java
public class AbsoluteSendRedirectFilter extends OncePerRequestFilter {
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
RedirectResponseWrapper redirectResponseWrapper = new RedirectResponseWrapper(request, response);
filterChain.doFilter(request, redirectResponseWrapper);
}
}
RedirectResponseWrapper.java
public class RedirectResponseWrapper extends HttpServletResponseWrapper {
private final HttpServletRequest request;
public RedirectResponseWrapper(final HttpServletRequest inRequest, final HttpServletResponse response) {
super(response);
this.request = inRequest;
}
@Override
public void sendRedirect(final String pLocation) throws IOException {
super.sendRedirect("https://" + this.request.getServerName()+pLocation);
}
}