zoukankan      html  css  js  c++  java
  • cookie

    前言

    • web应用程序使用http协议传输数据。而http是无状态的协议,一旦数据交换完毕,客户端与服务器端的连接就会关闭,再次交换数据需要建立新的连接。这就意味着服务器无法葱绿连接上跟踪会话。

    • 登录页面,关闭后重新打开后页面不用输入自动登录。?

    • 我们可以将登录信息存入Cookie中,再次打开页面只要cookie中的登录信息还处于存活期,则就能自动登录

    • cookie是由服务器端生成的,发送给User-Agent(一般是浏览器),(服务器告诉浏览器设置一下cookie),浏览器会将cookie以key/value的形式保存在某个目录下的文本文件内,下一次请求同一网站时就发送该cookie给服务器(前提是浏览器设置启用cookie)。

    • 当我们打开页面后进行的数据交互,浏览器会将一部分信息暂时存储到浏览器的目录下,即cookie,在cookie的存活周期下,我们关闭页面再次打开后,cooie中的信息我们就可以立即使用,而不需要再次请求数据交互

    • 满足同源策略

      • 虽然image.google.com和www.google.com同属于google,但是域名不一样,二者同样不能相互操作彼此的Cookie。

      • 访问zhidao.baidu.com后,再访问wenku.baidu.com,还需要重新登录百度账号吗?

        • 解决1:写入cookie时,设置其domaind都为.baidu.com,即只要其二级域名相同,则可共享该cookie

        • 解决2:通过document.domain,设置document.domain = 'baidu.com',则所有二级域名为baidu.com的页面都可以和该页面共享cookie(限制条件,设置document.domain的页面其url必须也有baidu.com,即也处于该基础域名下)

    • Cookie内存大小受限制:

      • Cookie有个数和大小的限制,内存大小一般是4k

      • 浏览器不同,其设置的每个域名限制设置的Cookie的个数样式不一样的

        • IE6:20

        • IE 7.0 8.0 -> 50

        • Opera -> 30

        • FF -> 50

        • safari -> 无限制

        • chrome -> 53

    • Cookie在本地,可以被更改文件,敏感的数据不要放到Cookie中

    • name:cookie的名字

    • value: cookie的值

    • domain:只有和domain值相同才能共享该条数据

    • path:cookie存放路径

    • expires:cookie的有效期,当设置cookie过期时间为0或者忽略不设置的情况下,cookie将会在session过期后过期(即浏览器关闭后cookie过期)

    • secure: 如果secure的属性值为true,则https下的资源可以送到服务器,secure的属性值为false,则https下的资源不能送到服务器,http不受此设置影响

    • 本地文件环境下,我们无法设置Cookie,也无法查Cookie,需要在服务器环境下
    1. document.cookie

    2. 通过new Date()、setDate()来设置Cookie的存活周期

      • 通过document.cookie 显示出所有的cookie信息

      • 通过设置document.cookie = "name=lyl"即可添加一条cooike,多个cookie之间自动用;连接(这样一次只能添加一条cookie,即一个名字和一个值)

      • document.cookie = 'name=lyl;expires=...' 通过添加指定属性和值,设置该条cookie的一些属性

    3. 封装函数

    • 添加一条cookie
     // 封装函数1
        function setCookie (name, value, iDay) {
            var oDate = new Date();
            oDate.setDate(oDate.getDate() + iDay);
    
            document.cookie = name + '=' + value + ';expires=' + oDate;
        }
        eg: setCookie('name', 'lyl', 10);;
     
    // 若有其他属性的添加的封装
         function setCookie(name, value, duration, path, domain, secure) {
            // name + value
            var cookieText = encodeURIComponent(name) + "=" + encodeURIComponent(value);
            // 生存期,此处参数设为天数
            var oDate = new Date();
            oDate.setDate(oDate.getDate() + duration);
            console.log(oDate);
            cookieText = cookieText + ";expires=" + oDate.toGMTString();
            // path
            if(path) {
                cookieText = cookieText + ';path=' + path;
            }
            // 作用域
            if(domain) {
                cookieText = cookieText + ';domain=' + domain; 
            }
            // secure
            if(secure) {
                cookieText = cookieText + ';secure=' + secure;
            }
            document.cookie = cookieText;
            console.log(cookieText);
        }
        eg: setCookie('name', 'duyi', 7);
    • 查看cookie
    // 封装函数1
        function getCookie (name) {
            var str = document.cookie;
            var arr = str.split(';');
            for(var i = 0, len = arr.length; i < len; i++) {
                var oneCookie = arr[i].split('=');
                if(oneCookie[0] === name) {
                    return oneCookie[1];
                }
            }
        }
       eg: getCookie('name');
     
     // 方案2,获取名为name的cookie值开始和结尾的索引
        function getCookie(name) {
            var cookieName = encodeURIComponent(name)+ '=',
                cookieStart = document.cookie.indexOf(cookieName),
                cookieValue = null;
            // 存在name该cookie
            if(cookieStart > -1){
                var cookieEnd = document.cookie.indexOf(';',cookieStart);
                // 只有一条名为name的cookie
                if(cookieEnd == -1){
                    cookieEnd = document.cookie.length;
                }
                // substring(start, end) 方法用于提取字符串中介于两个指定下标之间的字符,包括 start 处的字符,但不包括 end 处的字符。
                // substr(start, [length) 方法用于返回一个从指定位置开始的指定长度的子字符串,包含指定开始位置, start为负值,则倒过来截取即可
                cookieValue = decodeURIComponent(document.Cookie.substring(cookieStart + cookieName.length,cookieEnd));
            }
            return cookieValue;
        }    
     
    • 删除cookie(重新)
    // 将名为name的cookie有效期设为-1,即昨天就过期了,所以浏览器就会将该条cookie删去(注意:我们将该条cookie的有效期设为0,该cookie不会立刻删去,该cookie的有效期会变为Session) 
        function removeCookie(name) {
            setCookie(name, '', -1);
        }
     

    小demo

    • 一个可拖拽的div方块,从初始位置拖到某个其他位置,关闭页面后,再次打开该页面后,该div方块仍为关闭浏览器是的位置
     <script>
            var oDiv = document.getElementsByTagName('div')[0];
            
            // cookie的一些操作函数
            function removeCookie(name) {
                setCookie(name, '', -1);
            }
            function setCookie (name, value, iDay) {
                var oDate = new Date();
                oDate.setDate(oDate.getDate() + iDay);
    
                document.cookie = name + '=' + value + ';expires=' + oDate;
            }
             function getCookie (name) {
                var str = document.cookie;
                var arr = str.split(';');
                for(var i = 0, len = arr.length; i < len; i++) {
                    var oneCookie = arr[i].split('=');
                    if(oneCookie[0] === name) {
                        return oneCookie[1];
                    }
                }
            }
            
            // 获取cookie值,若有x和y的cookie值,则初始化oDiv的位置
            var x = getCookie('x');
            var y = getCookie('y');
            if(x) {
                oDiv.style.left = x + 'px';
                oDiv.style.top = y + 'px';
            }
            oDiv.onmousedown =  function(e) {
                    // console.log('mousedown');
                    var event = e || window.event;
                    var disX = event.clientX - this.offsetLeft;
                    var disY = event.clientY - this.offsetTop;
    
                    document.onmousemove = function(e){
                        var event = e || window.event;
    
                        oDiv.style.left = event.clientX - disX + 'px';
                        oDiv.style.top = event.clientY - disY + 'px';
                        console.log(oDiv.style.top);
                    }
    
                    document.onmouseup = function (e) {
                        document.onmousemove = null;
                        document.onmouseup = null;
                        // 存取最后存取位置信息到cookie
                        setCookie('x', oDiv.offsetLeft, 1);
                        setCookie('y', oDiv.offsetTop, 1);
                    }
             };
        </script>
     
  • 相关阅读:
    MYSQL删除表的记录后如何使ID从1开始
    Python chardet 字符编码判断
    中文搜索引擎技术揭密
    python 处理中文网页时,忽略特殊字符,忽略异常
    cmd 之基础命令
    自己写的删除主键的存储过程
    朝花夕拾delphi的三层结构
    ERWIN中的一对多标识关系和一对多非标识关系
    翻页用的SQL
    关于 Ajax 的一篇通俗易懂的文章
  • 原文地址:https://www.cnblogs.com/Walker-lyl/p/7454121.html
Copyright © 2011-2022 走看看