http切换https后redirect跳转过滤

全站 HTTPS并不是配置 证书 CA, 改改 路径URL那么简单! 

SSL卸载(SSL Offloading):把SSL配置在负载均 衡器 上,然后通过其处理 握手 之后将decode的https数据转发给后台的Web服务器。 
如下 构成 : 

            | 
            |(https) 
            | 
         Load Balancer 
      /        |        \ 
     /         |         \ 
    /(http)   |(http)    \(http) 
WebServer1  WebServer2  WebServer3 

HTTPS的加密传输将 只限 于客户端 发起 请求到负载均衡器之间的 公网 阶段,内网的通讯扔使用非加密的HTTP传输。每个Web服务器中所有的处理请求都认为是来自http,所有相对路径的 sendredirect 将都会被转发到http! 

比如在Filter或Interceptor里的sendRedirect: 
response.sendRedirect(request.getContextPath() + "/admin/welcome.do?flag=timeout");

或者Spring的Controller里的“redirect:”: 
return "redirect:/admin/welcome.do";


通过HttpServletResponseWrapper可以通过Filter 拦截 SendRedirect请求并固定跳转到HTTPS。 

web.xml 
<filter>
<filter-name>AbsoluteSendRedirectFilter</filter-name>
<filter-class>com.rensanning.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 {

if (StringUtils.isBlank(pLocation)) {
super.sendRedirect(pLocation);
return;
}

try {
final URI uri = new URI(pLocation);
if (uri.getScheme() != null) {
super.sendRedirect(pLocation);
return;
}
} catch (URISyntaxException ex) {
super.sendRedirect(pLocation);
}

// !!! FIX Scheme !!!
String finalurl = "https://" + this.request.getServerName();
if (request.getServerPort() != 80 && request.getServerPort() != 443) {
finalurl += ":" + request.getServerPort();
}
finalurl += pLocation;

super.sendRedirect(finalurl);
}

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值