zoukankan      html  css  js  c++  java
  • cookie

    HTTP Cookie,是在客户端用于存储会话信息的。规范要求服务器对任意HTTP请求发送Set-Cookie HTTP头作为响应的一部分,其中包含会话信息。浏览器会存储这样的会话信息,并在这之后,通过为每个请求添加Cookie HTTP头将信息发送给服务器。Http协议是无状态的,对于同一个浏览器发出的多个请求,web服务器是无法区分来源,cookie在客户端解决这个问题。发送回服务器的额外信息可以用于验证请求是来自哪个客户。

    限制:

    ①  Cookie无法跨域,只能是相同域、相同协议内使用。

    ②  每个域的Cookie总数是有限的。当超过单个域名数量限制之后,浏览器会根据自身规则清除以前设置的cookie。

    ③  浏览器中对于cookie的大小也有限制,一般一个域下所有的cookie大小不超过4kb,如果超过那么该cookie就会被悄无声息地丢掉。

    cookie的字段

      name:必须,名称是不分大小写的,实践中最好是将cookie名称看做是区分大小写的,因为某些服务器会处理cookie。在传送时必须被URL编码。

      value:必须,cookie的字符串值。在传送时必须被URL编码。

      domain:该cookie对于哪个域是有效的。所有从该域资源内发出的请求都会包含这个cookie信息。如果没有明确设定,那么这个域会被认作来自设置cookie的那个域。

      path:指定域中的哪个路径,应该向服务器发送cookie信息。     

      expires/Max-Age :当前cookie何时应该被删除的时间戳。若设置其值为一个时间(GMT格式的日期,注意客户端的时区设定),那么当到达此时间后,此cookie会被删除。如果设置的值是负值或0,cookie也会被立即删除。不显示设置的话默认值是session,即cookie和session的有效期一样。当浏览器关闭后(不是浏览器窗口标签,而是浏览器应用) ,会话结束,cookie/session被清除。

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

      secure :cookie只有在使用SSL连接的时候才发送到服务器。

    JavaScript中的cookie

    document.cookie返回当前可用的(根据cookie的域、路径、失效日期和安全设置)所有的cookie字符串,每条记录由分号隔开(如name1=value1;name2=value2)。

    注意:

    1.所有名字和值都是经过URL编码的,所以必须使用decodeURLComponent()来解码。

    2.document.cookie也可以设置一个新的cookie字符串,这个cookie字符串会被解释并添加到现有的cookie集合中。设置document.cookie并不会覆盖cookie,除非设置的cookie的名称已经存在。一次只能设置一条cookie信息,多余的cookie会被丢弃。

           document.cookie=”userName=kevin;expires=expiration_time”

    3.javascript和动态页只能设置过期时间,无法获取cookie过期的时间,因为其他信息被浏览器隐藏,但在chrome的application下可以查看到失效时间。

    It is not possible to get the expiration date of a cookie through Javascript; only key-value pairs are exposed through document.cookie.

    4.expires=NaN时,ie8下cookie被立即删除;ie8+及chrome时,会生效,有效时间为365天。

      expries=0或负数时,当前cookie会被立即删除,不会被保存到内存中,也不会被持久化。

      

    格林尼治时间(GMT)已经不再被作为标准时间使用,现在的标准时间为协调世界时(UTC),由原子钟提供。toUTCString()和toGMTString()在同一个浏览器中输出一样。

    将对cookie的操作封装成JS库:

    (function (root, factory) {
        if (typeof define === 'function' && define.amd) {
            // AMD. Register as an anonymous module.
            define(factory);
        } else if (typeof exports === 'object') {
            // Node. Does not work with strict CommonJS, but
            // only CommonJS-like enviroments that support module.exports, like Node.
            module.exports = factory();
        } else {
            // Browser globals (root is window)
            root.Cookie = factory();
        }
    }(this, function () {
        // Just return a value to define the module export.
        // This example returns an object, but the module
        // can return a function as the exported value.
        var Cookie = function () {
            this.set = function (name, value,days, path) {
                var cookieText = encodeURIComponent(name) + "=" + encodeURIComponent(value);
                if (days) {
                    var now = new Date();
                    now.setDate(now.getDate()+days);
                    cookieText += "; expires=" +now.toUTCString();
                }
                if (path) {
                    cookieText += "; path=" + path;
                }
                document.cookie = cookieText;
            };
            this.get =  function (name){
                var cookieName = encodeURIComponent(name) + '=',
                cookieStart = document.cookie.indexOf(cookieName),
                cookieValue = null;
                if (cookieStart > -1){
                    var cookieEnd = document.cookie.indexOf(";", cookieStart);
                    if (cookieEnd == -1){
                        cookieEnd = document.cookie.length;
                    }
                    cookieValue = decodeURIComponent(document.cookie.substring(cookieStart + cookieName.length, cookieEnd));
                }
                return cookieValue;
            };
            this.del = function (name, path){
                this.set(name, '',0, path);
            }
        };
        return new Cookie;
    }));

     

  • 相关阅读:
    Java多线程系列 JUC锁03 公平锁(一)
    Java多线程系列 JUC锁02 互斥锁ReentrantLock
    JDBC课程3--通过ResultSet执行查询操作
    JDBC课程2--实现Statement(用于执行SQL语句)--使用自定义的JDBCTools的工具类静态方法,包括insert/update/delete三合一
    JDBC_通过DriverManager获得数据库连接
    JDBC课程1-实现Driver接口连接mysql数据库、通用的数据库连接方法(使用文件jdbc.properties)
    [终章]进阶20-流程控制结构--if/case/while结构
    MySQL进阶19--函数的创建(举例)/设置mysql的创建函数的权限/查看(show)/删除(drop) / 举4个栗子
    MySQL进阶18- 存储过程- 创建语句-参数模式(in/out/inout-对应三个例子) -调用语法-delimiter 结束标记'$'- 删除/查看/修改-三个练习
    SQL进阶17-变量的声明/使用(输出)--全局变量/会话变量--用户变量/局部变量
  • 原文地址:https://www.cnblogs.com/kevin2chen/p/6700222.html
Copyright © 2011-2022 走看看