zoukankan      html  css  js  c++  java
  • Cookie深度解析

    <h1>
        <span class="link_title"><a href="/ghsau/article/details/20395681">
        Cookie深度解析        
           
        </a>
        </span>
    
         
    </h1>
    
        <div class="article_manage clearfix">
        <div class="article_l">
            <span class="link_categories">
            标签:
              <a href="http://www.csdn.net/tag/cookie" target="_blank" onclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_tag']);">cookie</a>
            </span>
        </div>
        <div class="article_r">
            <span class="link_postdate">2014-03-04 12:37</span>
            <span class="link_view" title="阅读次数">38571人阅读</span>
            <span class="link_comments" title="评论次数"> <a href="#comments" onclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_pinglun'])">评论</a>(17)</span>
            <span class="link_collect tracking-ad" data-mod="popu_171"> <a href="javascript:void(0);" onclick="javascript:collectArticle('Cookie%e6%b7%b1%e5%ba%a6%e8%a7%a3%e6%9e%90','20395681');return false;" title="收藏" target="_blank">收藏</a></span>
             <span class="link_report"> <a href="#report" onclick="javascript:report(20395681,2);return false;" title="举报">举报</a></span>
    
        </div>
    </div>    <style type="text/css">        
            .embody{
                padding:10px 10px 10px;
                margin:0 -20px;
                border-bottom:solid 1px #ededed;                
            }
            .embody_b{
                margin:0 ;
                padding:10px 0;
            }
            .embody .embody_t,.embody .embody_c{
                display: inline-block;
                margin-right:10px;
            }
            .embody_t{
                font-size: 12px;
                color:#999;
            }
            .embody_c{
                font-size: 12px;
            }
            .embody_c img,.embody_c em{
                display: inline-block;
                vertical-align: middle;               
            }
             .embody_c img{               
                30px;
                height:30px;
            }
            .embody_c em{
                margin: 0 20px 0 10px;
                color:#333;
                font-style: normal;
            }
    </style>
    <script type="text/javascript">
        $(function () {
            try
            {
                var lib = eval("("+$("#lib").attr("value")+")");
                var html = "";
                if (lib.err == 0) {
                    $.each(lib.data, function (i) {
                        var obj = lib.data[i];
                        //html += '<img src="' + obj.logo + '"/>' + obj.name + "&nbsp;&nbsp;";
                        html += ' <a href="' + obj.url + '" target="_blank">';
                        html += ' <img src="' + obj.logo + '">';
                        html += ' <em><b>' + obj.name + '</b></em>';
                        html += ' </a>';
                    });
                    if (html != "") {
                        setTimeout(function () {
                            $("#lib").html(html);                      
                            $("#embody").show();
                        }, 100);
                    }
                }      
            } catch (err)
            { }
            
        });
    </script>
      <div class="category clearfix">
        <div class="category_l">
           <img src="http://static.blog.csdn.net/images/category_icon.jpg">
            <span>分类:</span>
        </div>
        <div class="category_r">
                    <label onclick="GetCategoryArticles('1231374','ghsau','top','20395681');">
                        <span onclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_fenlei']);">Java Web<em>(12)</em></span>
                      <img class="arrow-down" src="http://static.blog.csdn.net/images/arrow_triangle _down.jpg" style="display:inline;">
                      <img class="arrow-up" src="http://static.blog.csdn.net/images/arrow_triangle_up.jpg" style="display:none;">
                        <div class="subItem">
                            <div class="subItem_t"><a href="http://blog.csdn.net/ghsau/article/category/1231374" target="_blank">作者同类文章</a><i class="J_close">X</i></div>
                            <ul class="subItem_l" id="top_1231374">                            
                            </ul>
                        </div>
                    </label>                    
        </div>
    </div>
        <div class="bog_copyright">         
            <p class="copyright_p">版权声明:本博客所有的原创文章,作者皆保留版权。</p>
        </div>
    

           本文来自:高爽|Coder,原文地址:http://blog.csdn.net/ghsau/article/details/20466351,转载请注明。
           最近在公司做了Web端单点登录(SSO)功能,基于Cookie实现,做完之后感觉有必要总结一下,本文着重讲解Cookie,下文会说明单点登录的实现方案。

    Cookie简介

           众所周知,Web协议(也就是HTTP)是一个无状态的协议(HTTP1.0)。一个Web应用由很多个Web页面组成,每个页面都有唯一的URL来定义。用户在浏览器的地址栏输入页面的URL,浏览器就会向Web Server去发送请求。如下图,浏览器向Web服务器发送了两个请求,申请了两个页面。这两个页面的请求是分别使用了两个单独的HTTP连接。所谓无状态的协议也就是表现在这里,浏览器和Web服务器会在第一个请求完成以后关闭连接通道,在第二个请求的时候重新建立连接。Web服务器并不区分哪个请求来自哪个客户端,对所有的请求都一视同仁,都是单独的连接。这样的方式大大区别于传统的(Client/Server)C/S结构,在那样的应用中,客户端和服务器端会建立一个长时间的专用的连接通道。正是因为有了无状态的特性,每个连接资源能够很快被其他客户端所重用,一台Web服务器才能够同时服务于成千上万的客户端。
           但是我们通常的应用是有状态的。先不用提不同应用之间的SSO,在同一个应用中也需要保存用户的登录身份信息。例如用户在访问页面1的时候进行了登录,但是刚才也提到,客户端的每个请求都是单独的连接,当客户再次访问页面2的时候,如何才能告诉Web服务器,客户刚才已经登录过了呢?浏览器和服务器之间有约定:通过使用cookie技术来维护应用的状态。Cookie是可以被Web服务器设置的字符串,并且可以保存在浏览器中。如下图所示,当浏览器访问了页面1时,web服务器设置了一个cookie,并将这个cookie和页面1一起返回给浏览器,浏览器接到cookie之后,就会保存起来,在它访问页面2的时候会把这个cookie也带上,Web服务器接到请求时也能读出cookie的值,根据cookie值的内容就可以判断和恢复一些用户的信息状态。

    Cookie组成

           cookie是由名称、内容、作用路径、作用域、协议、生存周期组成,另外还有个HttpOnly属性,HttpOnly属性很重要,如果您在cookie中设置了HttpOnly属性,那么通过js脚本(document.cookie)将无法读取到cookie信息,这样能一定程度上的防止XSS攻击,关于XSS可以看我之前的文章--XSS攻击及防御。Tomcat服务器设置的JSESSIONID就是HttpOnly的。
           JavaEE中对cookie做了封装,对应的是下面这个类:

    java.lang.Object
      |
      +--javax.servlet.http.Cookie
           该类可以设置cookie的名称、内容、作用路径、作用域、协议、生存周期,but不能设置HttpOnly属性,不知道这么做是出于什么考虑,如果非要设置HttpOnly的cookie,我们可以通过响应头来处理:
    1. response.setHeader("Set-Cookie""cookiename=value;Path=/;Domain=domainvalue;Max-Age=seconds;HttpOnly");  
    Cookie作用域
           测试Cookie的作用域需要弄几个域名,修改C:WindowsSystem32driversetchosts文件,将本机ip映射出四个域名,如下:
    1. 127.0.0.1 web1.ghsau.com  
    2. 127.0.0.1 web2.ghsau.com  
    3.   
    4. 127.0.0.1 web1.com  
    5. 127.0.0.1 web2.com  
           前两个是2级域名(ghsau.com)相同,3级域名(web1、web2)不同,后两个是2级域名不同。然后我们再写两个jsp,一个用于设置Cookie,另一个用于显示Cookie。

           SetCookie.jsp:

    1. <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>  
    2. <%  
    3.     Cookie cookie = new Cookie("test_key", "test_value");  
    4.     cookie.setPath("/");  
    5. //  cookie.setDomain(".ghsau.com");  
    6.     response.addCookie(cookie);  
    7. %>  
          ShowCookie.jsp:
    1. <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>  
    2. <%  
    3.     // 输出cookies,过滤掉JSESSIONID  
    4.     Cookie[] cookies = request.getCookies();  
    5.     if(cookies != null)  
    6.         for(Cookie cookie : cookies) {  
    7.             if(cookie.getName().equals("JSESSIONID"))    continue;  
    8.             out.println(cookie.getName() + "-" + cookie.getValue());  
    9.         }  
    10. %>  
           将这两个jsp放到应用后,部署到服务器中,启动服务器,我们就可以通过域名来访问了。
           测试一,首先访问http://web1.ghsau.com:8080/WebSSOAuth/SetCookie.jsp,设置cookie后,再访问http://web1.ghsau.com:8080/WebSSOAuth/ShowCookie.jsp,页面输出test_key=test_value,这时我们访问http://web2.ghsau.com:8080/WebSSOAuth/ShowCookie.jsp,发现页面什么都没有输出,这时我们得出结论,cookie默认情况下作用域为当前域名
           测试二,将SetCookie.jsp第五行注释打开,按照上面的顺序依次访问,我们发现http://web2.ghsau.com:8080/WebSSOAuth/ShowCookie.jsp中输出了http://web1.ghsau.com:8080/WebSSOAuth/SetCookie.jsp中设置的cookie,这时我们得出结论,cookie作用域为父级域名时,所有子级域名都可以得到该cookie,这也是实现跨子域SSO的关键。这时有些朋友可能会想到那我把cookie作用域设置到顶级域名(.com、.net)上,是不是用该顶级域名的网站就都能获取该cookie了?这样设置的cookie,浏览器是不存储的,无效的cookie。

           测试三,修改SetCookie.jsp第五行代码为cookie.setDomain(".web2.com"),首先访问http://web1.com:8080/WebSSOAuth/SetCookie.jsp,设置cookie后,这时我们访问http://web2.com:8080/WebSSOAuth/ShowCookie.jsp,发现页面什么都没有输出,这时我们得出结论,cookie不能跨二级域名设置

    Cookie安全性

           cookie中的数据通常会包含用户的隐私数据,首先要保证数据的保密性,其次要保证数据不能被伪造或者篡改,基于这两点,我们通常需要对cookie内容进行加密,加密方式一般使用对称加密(单密钥,如DES)或非对称加密(一对密钥,如RSA),密钥需要保存在服务器端一个安全的地方,这样,别人不知道密钥时,无法对数据进行解密,也无法伪造或篡改数据。另外,像上文提到的,重要的cookie数据需要设置成HttpOnly的,避免跨站脚本获取你的cookie,保证了cookie在浏览器端的安全性。还有我们可以设置cookie只作用于安全的协议(https),JavaEE中可以通过Cookie类的setSecure(boolean flag)来设置,设置后,该cookie只会在https下发送,而不会再http下发送,保证了cookie在服务器端的安全性,服务器https的设置可以参照该文章
           本文来自:高爽|Coder,原文地址:http://blog.csdn.net/ghsau/article/details/20466351,转载请注明。

        <div id="digg" articleid="20395681">
            <dl id="btnDigg" class="digg digg_disable" onclick="btndigga();">
               
                 <dt>顶</dt>
                <dd>2</dd>
            </dl>
           
              
            <dl id="btnBury" class="digg digg_disable" onclick="btnburya();">
              
                  <dt>踩</dt>
                <dd>1</dd>               
            </dl>
            
        </div>
     <div class="tracking-ad" data-mod="popu_222"><a href="javascript:void(0);" target="_blank">&nbsp;</a>   </div>
    <div class="tracking-ad" data-mod="popu_223"> <a href="javascript:void(0);" target="_blank">&nbsp;</a></div>
    <script type="text/javascript">
        function btndigga() {
            $(".tracking-ad[data-mod='popu_222'] a").click();
        }
        function btnburya() {
            $(".tracking-ad[data-mod='popu_223'] a").click();
        }
            </script>
    
    <div style="clear:both; height:10px;"></div>
    
    
            <div class="similar_article">
                    <h4></h4>
                    <div class="similar_c" style="margin:20px 0px 0px 0px">
                        <div class="similar_c_t">
                          &nbsp;&nbsp;相关文章推荐
                        </div>
                   
                        <div class="similar_wrap tracking-ad" data-mod="popu_36" style="max-height:250px">                       
                            <ul class="similar_list fl">    
                                   <li>
                                       <em>•</em>
                                       <a href="http://blog.csdn.net/Evankaka/article/details/48785513" title="Spring+Mybatis+SpringMVC+Maven+MySql搭建实例" strategy="BlogCommendFromBaidu_0" target="_blank">Spring+Mybatis+SpringMVC+Maven+MySql搭建实例</a>
                                   </li>
                                   <li>
                                       <em>•</em>
                                       <a href="http://edu.csdn.net/huiyiCourse/detail/596?utm_source=blog7" title="免费直播 神经网络的原理及结构设计--何宇健" strategy="undefined" target="_blank">免费直播 神经网络的原理及结构设计--何宇健</a>
                                   </li>
                                   <li>
                                       <em>•</em>
                                       <a href="http://blog.csdn.net/ghsau/article/details/52097612" title="MySQL字符集不一致导致索引失效" strategy="BlogCommendFromBaidu_1" target="_blank">MySQL字符集不一致导致索引失效</a>
                                   </li>
                                   <li>
                                       <em>•</em>
                                       <a href="http://edu.csdn.net/huiyiCourse/detail/602?utm_source=blog7" title="Apache Weex:移动研发的进阶之路--董岩" strategy="undefined" target="_blank">Apache Weex:移动研发的进阶之路--董岩</a>
                                   </li>
                                   <li>
                                       <em>•</em>
                                       <a href="http://blog.csdn.net/yimi099/article/details/62043566" title="Java HashMap中在resize()时候的rehash,即再哈希法的理解" strategy="BlogCommendFromBaidu_2" target="_blank">Java HashMap中在resize()时候的rehash,即再哈希法的理解</a>
                                   </li>
                                   <li>
                                       <em>•</em>
                                       <a href="http://edu.csdn.net/course/detail/6252?utm_source=blog7" title="C++ 百万并发网络通信引擎架构与实现" strategy="undefined" target="_blank">C++ 百万并发网络通信引擎架构与实现</a>
                                   </li>
                                   <li>
                                       <em>•</em>
                                       <a href="http://blog.csdn.net/yissan/article/details/50888070" title="Java你可能不知道的事(3)HashMap" strategy="BlogCommendFromBaidu_3" target="_blank">Java你可能不知道的事(3)HashMap</a>
                                   </li>
                                   <li>
                                       <em>•</em>
                                       <a href="http://edu.csdn.net/course/detail/6271?utm_source=blog7" title="PHP入门到精通及项目实战" strategy="undefined" target="_blank">PHP入门到精通及项目实战</a>
                                   </li>
                            </ul>
                              <ul class="similar_list fr">      
                                   <li>
                                       <em>•</em>
                                       <a href="http://blog.csdn.net/ghsau/article/details/23557915" title="INSERT ... ON DUPLICATE KEY UPDATE" strategy="BlogCommendFromBaidu_4" target="_blank">INSERT ... ON DUPLICATE KEY UPDATE</a>
                                   </li>
                                   <li>
                                       <em>•</em>
                                       <a href="http://edu.csdn.net/course/detail/6409?utm_source=blog7" title=" Kotlin基本语法到实战开发" strategy="undefined" target="_blank"> Kotlin基本语法到实战开发</a>
                                   </li>
                                   <li>
                                       <em>•</em>
                                       <a href="http://blog.csdn.net/shijing266/article/details/50786786" title="面试题总结 —— JAVA高级工程师" strategy="BlogCommendFromBaidu_5" target="_blank">面试题总结 —— JAVA高级工程师</a>
                                   </li>
                                   <li>
                                       <em>•</em>
                                       <a href="http://edu.csdn.net/course/detail/2932?utm_source=blog7" title=" Android 实战开发 第三方SDK 讯飞语音SDK" strategy="undefined" target="_blank"> Android 实战开发 第三方SDK 讯飞语音SDK</a>
                                   </li>
                                   <li>
                                       <em>•</em>
                                       <a href="http://blog.csdn.net/ghsau/article/details/7243498" title="在jar包中如何获得当前项目的绝对路径" strategy="BlogCommendFromBaidu_6" target="_blank">在jar包中如何获得当前项目的绝对路径</a>
                                   </li>
                                   <li>
                                       <em>•</em>
                                       <a href="http://blog.csdn.net/yx_play/article/details/50769263" title="HashMap深度解析(二)" strategy="BlogCommendFromBaidu_7" target="_blank">HashMap深度解析(二)</a>
                                   </li>
                                   <li>
                                       <em>•</em>
                                       <a href="http://blog.csdn.net/tolcf/article/details/39188605" title="containsKey方法——判断是否包含指定的键名" strategy="BlogCommendFromBaidu_8" target="_blank">containsKey方法——判断是否包含指定的键名</a>
                                   </li>
                                   <li>
                                       <em>•</em>
                                       <a href="http://blog.csdn.net/a1126238643/article/details/49456551" title="Cookie深度解析" strategy="BlogCommendFromCsdn_9" target="_blank">Cookie深度解析</a>
                                   </li>
                            </ul>
                        </div>
                    </div>
                </div>   
    
  • 相关阅读:
    DGL学习(一):使用DGL跑一个最简单的GCN
    2020-7-15
    2020-7-14
    2020-7-13
    hdu 6118度度熊的交易计划(费用流)
    玲珑OJ Down the Rabbit Hole (DFS序查找路径)
    csu 1982:小M的移动硬盘(双向链表)
    csu 1930 roads(DFS)
    LuoGuP4721:【模板】分治 FFT
    LuoGuP4284:[SHOI2014]概率充电器
  • 原文地址:https://www.cnblogs.com/jobs-lgy/p/7813415.html
Copyright © 2011-2022 走看看