zoukankan      html  css  js  c++  java
  • cookies

    https://www.cnblogs.com/shiyangxt/articles/1305506.htmlcookie和session

    Cookie是由服务器生成,保存在客户端本地的一个文件,通过response响应头的set-Cookie字段进行设置,下面是一个示例:

    Cookie包含什么信息?
    它可以记录你的用户ID、密码、浏览过的网页、停留的时间等信息。当你再次来到该网站时,网站通过读取Cookies,得知你的相关信息,就可以做出相应的动作,如在页面显示欢迎你的标语,或者让你不用输入ID、密码就直接登录等等。一个网站只能读取它自己放置的信息,不能读取其他网站的Cookie文件。因此,Cookie文件还保存了host属性,即网站的域名或ip。
    这些属性以名值对的方式进行保存,为了安全,它的内容大多进行了加密处理。Cookie文件的命名格式是:用户名@网站地址[数字].txt

    name字段为一个cookie的名称。

    value字段为一个cookie的值。

    domain字段为可以访问此cookie的域名。

    path字段为可以访问此cookie的页面路径。 比如domain是abc.com,path是/test,那么只有/test路径下的页面可以读取此cookie。

    expires/Max-Age 字段为此cookie超时时间。若设置其值为一个时间,那么当到达此时间后,此cookie失效。不设置的话默认值是Session,意思是cookie会和session一起失效。当浏览器关闭(不是浏览器标签页,而是整个浏览器) 后,此cookie失效。

    Size字段 此cookie大小。

    http字段  cookie的httponly属性。若此属性为true,则只有在http请求头中会带有此cookie的信息,而不能通过document.cookie来访问此cookie。

    secure 字段 设置是否只能通过https来传递此条cookie

    将重要的cookie标记为http only,   这样的话当浏览器向Web服务器发起请求的时就会带上cookie字段,但是在脚本中却不能访问这个cookie,这样就避免了XSS攻击利用JavaScript的document.cookie获取cookie。

    设置cookie

    每个cookie都是一个名/值对,可以把下面这样一个字符串赋值给document.cookie(多个cookie之间用半角的’; ‘分隔)

    document.cookie="age=28;userName=hulk"; 

    注意:cookie 的名或值中不能使用分号(;)、逗号(,)、等号(=)、空格,以及中文(会出现错误或乱码问题)。 
    如果必须使用上述的特殊字符,则需要用escape()函数进行编码(以16进制数的形式转码)存储:

    document.cookie="userName="+escape("珊珊");   //cookie的存储形式为"userName=%u73CA%u73CA"

    读取cookie

    var cookies = doucment.cookie;
    alert(cookies); //"age=28;userName=%u73CA%u73CA"

    如果想读取指定的cookie值,只能自己解析获得到的包含所有cookie的字符串。 
    例如,要获取age的值,可以这样实现:

    var age = document.cookie.split("age=")[1].split(";")[0];   //28

    如果想要读取含特殊字符如中文的cookie值, 
    取出值以后需要使用unescape()进行解码才能得到原来的cookie值 
    例如,要获取userName的值,可以这样实现:

    var name= unescape(document.cookie.split("userName=")[1].split(";")[0]);    //珊珊

    给cookie设置终止日期

    现在的cookie都是单会话cookie,即浏览器关闭后这些cookie将会丢失,事实上这些cookie仅仅是存储在内存中,而没有建立相应的硬盘文件。 
    如果需要长期保存cookie(例如保存用户登录的状态就需要长期保存),如10天。可以用下面的方式来实现:

    <script> 
        var date = new Date();  //获取当前时间
        date.setTime(date.getTime()+10*24*3600*1000); //获取10天后的时间戳
    
        //将age和userName两个cookie设置为10天后过期
        document.cookie="age=28;userName=aaa;expires="+date.toGMTString(); 
    </script> 

    删除cookie

    如果要删除一个cookie,可以将其过期时间设定为一个过去的时间。 
    例如删除age这个cookie:

        var date = new Date();
        date.setTime(date.getTime()-10000);
        document.cookie="age=28;expires="+date.toGMTString();

    指定可访问cookie的路径

    默认情况下,创建的cookie只可以由它所在目录的 同级目录 或同级目录的 子集目录 访问。 
    可以使用path参数设置可访问cookie的目录:

    document.cookie="age=28; path=/shop";  //表示当前cookie仅能在shop目录下使用。
    document.cookie="userId=320; path=/";  //表示当前cookie可在整站使用。
    document.cookie="name=value;domain=.baidu.com";  //这样,所有baidu.com下的主机都可以访问该cookie

    编码:

    乱码的原因要么编码不支持,要么就是存储端解码和接收端编码使用的编码集不一样.

    第一步:先解决cookie存入时不支持中文的乱码报错问题

    cookie(String name,URLEncode("String value","UTF-8"));存储前先使用UTF-8解码

    第二步解决接收端的乱码问题:保证存储和接收编码集一致

    URLDecoder.decode(cookies[i].getValue(), "UTF-8"),接收的数据用UTF-8编码

    Cookie存取中文的时候可能会出现乱码问题,这是因为cookie文件是以ASCII编码格式来存放的,占2个字节,而Unicode中的字符占用4个字节。所以,要在cookies中保存中文的话,必须进行相应的编码后才能正确的存取,读取时还要解码。

    实例:

     1 cookie存取:
     2 存: Cookie cookie = new Cookie("title",URLEncoder.encode("标题","utf-8"))
     3          cookie.setMaxAge(365 * 24 * 60 * 60);
     4           response.addCookie(cookie);
     5 取: Cookie[] cookies = request.getCookies();
     6          Cookie sCookie = null;
     7          String cookievalue="";
     8          for(int i = 0; i < cookies.length; i++){
     9                 sCookie = cookies[i];
    10                 if(sCookie.getName()!=null&&sCookie.getName().equals("title"))
    11                           cookievalues=URLDecoder.decode(sCookie.getValue(),"utf-8");
    12          }
  • 相关阅读:
    [LintCode] Merge Two Sorted Lists 混合插入有序链表
    Convert PLY to VTK Using PCL 1.6.0 or PCL 1.8.0 使用PCL库将PLY格式转为VTK格式
    [LintCode] Best Time to Buy and Sell Stock II 买股票的最佳时间之二
    [LintCode] Maximum Subarray 最大子数组
    [LeetCode] Matchsticks to Square 火柴棍组成正方形
    [LeetCode] Sort Characters By Frequency 根据字符出现频率排序
    [LeetCode] 450. Delete Node in a BST 删除二叉搜索树中的节点
    [LeetCode] Serialize and Deserialize BST 二叉搜索树的序列化和去序列化
    [LeetCode] Find All Numbers Disappeared in an Array 找出数组中所有消失的数字
    [LeetCode] Add Two Numbers II 两个数字相加之二
  • 原文地址:https://www.cnblogs.com/sarah-wen/p/10823598.html
Copyright © 2011-2022 走看看