当前位置:编程学习 > JAVA >>

HTTPS重定向到HTTP

一.场景:
  在企业内网应用,以及一些安全要求不高的网站会有一些https转http的需求,例如只是登陆https协议,其他请求都是走http协议,走http协议不再需要重新登陆一次。

 

二.解决方案
  Cookie时效:

  当cookie是secure的情况下,当服务器从https协议重定向到http协议后,这样的cookie就不会随请求发送到服务器。
  当cookie不是secure的情况下,当服务器从http协议重定向到https协议后,这样的cookie就不会随请求发送到服务器。
      所以解决的方法就是在https认证后,除了构造一个secure的cookie(包含session id信息),同时构造一个非secure的cookie(包含session id信息),这样页面跳转后就一致保持session有效了,从而达到https重定向到http后不需要登陆的效果。

 

  

 

  图中没有详细描述web容器的跳转,仅仅想描述协议转换的实现过程。

     主要点说明:

  重定向跳转在页面中实现,而不在Authenticator实现,也不在Filter实现,因为Response已经commit。

  Filter实现增加非Secure cookie的逻辑,代码:

  

[java]
import java.io.IOException; 
 
import javax.servlet.Filter; 
import javax.servlet.FilterChain; 
import javax.servlet.FilterConfig; 
import javax.servlet.ServletException; 
import javax.servlet.ServletRequest; 
import javax.servlet.ServletResponse; 
import javax.servlet.http.Cookie; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
import javax.servlet.http.HttpSession; 
 
public class HttpsCookieFilter implements Filter { 
 
    @Override 
    public void destroy() { 
 
    } 
 
    @Override 
    public void doFilter(ServletRequest request, ServletResponse response, 
            FilterChain chain) throws IOException, ServletException { 
         
        final HttpServletRequest httpRequest = (HttpServletRequest) request; 
        final HttpServletResponse httpResponse = (HttpServletResponse) response; 
        final HttpSession session = httpRequest.getSession(false); 
 
        // servlet3 
        if (session != null) { 
            System.out.println("HttpsCookieFilter set session cookie:" 
                    + session.getId()); 
            final Cookie cookie = new Cookie("JSESSIONID", 
                    session.getId()); 
            cookie.setMaxAge(-1);//no store 
            cookie.setSecure(false); 
            cookie.setPath(httpRequest.getContextPath()); 
            cookie.setHttpOnly(true); 
            httpResponse.addCookie(cookie); 
        } 
         
        //servlet2 
        //httpResponse.addHeader( 
        //          "Set-Cookie", 
        //          "JSESSIONID=" + session.getId() + "; Path=" 
        //                  + httpRequest.getContextPath() + "; HttpOnly"); 
                             
         
        chain.doFilter(request, response); 
         
 
    } 
 
    @Override 
    public void init(FilterConfig arg0) throws ServletException { 
    } 
 

  

补充:软件开发 , Java ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,