zoukankan      html  css  js  c++  java
  • 【转】HTTPS重定向到HTTP

    转自:http://www.2cto.com/kf/201209/158531.html

    一.场景:
      在企业内网应用,以及一些安全要求不高的网站会有一些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 {
    }
    }

    (--***-曾经受过的伤,觉得一辈子也忘不了,可还是都过来了。曾经离开的人,以为一辈子也放不开,可后来还是发现,原来真的不会,离开谁就活不下去。曾经说着的梦想,你也没能实现,可是却在实现梦想的努力中,找到了喜欢的那个自己。-***-)
  • 相关阅读:
    ssh时传递环境变量
    linux删除文件后磁盘空间未释放的问题
    gitlab-ci配置疑难备忘
    javac老提示无效的标记
    unity5.6里Baked Lighting下面几个Lighting Mode的解释
    屌爆的xamarin,一人单挑google/apple/windows
    xamarin.droid自己的示例工程有些都装不上模拟器,是因为它的architectures选项没设对
    使用NFC读卡器ACR122u读取银行卡信息
    【转】Gnirehtet – 为 Android 设备提供反向网络连接[Windows、macOS、Linux]
    【转】1分钟学会U盘启动安装Linux系统
  • 原文地址:https://www.cnblogs.com/huzhiwei/p/2826515.html
Copyright © 2011-2022 走看看