为何网站的cookie有时候获取不到?

工做中有好多同事问我,那个谁,为何我用网上封装的获取cookie的方法却获取不到本身网站上的cookie呢?浏览器

这个问题,咱们还要从document.cookie提及(其实网上封装的获取cookie的方法里面也是用的这个方法),
MDN上给的文档:
clipboard.png
注意,这里给出的解释是获取全部可今后位置访问到的cookie;cookie

不着急,我们继续往下看;
这是文档里给出的属性值;dom

  • ;path=path (例如 '/', '/mydir') 若是没有定义,默认为当前文档位置的路径。
  • ;domain=domain (例如 'example.com', 'subdomain.example.com') 若是没有定义,默认为当前文档位置的路径的域名部分。与早期规范相反的是,在域名前面加 . 符将会被忽视,由于浏览器也许会拒绝设置这样的cookie。若是指定了一个域,那么子域也包含在内。
  • ;max-age=max-age-in-seconds (例如一年为606024*365)
  • ;expires=date-in-GMTString-format 若是没有定义,cookie会在对话结束时过时
  • ;secure (cookie只经过https协议传输)

其实形成取不到值得主要缘由就是path这个属性
这里的path属性是指你能够从xxx.xxx.com/xxx/x中访问到cookie(当时是在这个页面设置的cookie),但在xxx.xxx.com这个目录下是访问不到cookie的;网站

这就至关于你在A店里定了一盒曲奇饼干,但你去B店拿,显然是拿不到的。this

在浏览器中也能够很方便很直观的看到区别:spa

clipboard.png
可是这里也有一个规则,就是子文件夹下的页面能够访问上级页面存下的cookie,但父级文件夹的页面访问不到子文件夹下的页面建立的cookie;
因此,一般咱们在设置cookie的时候,能够统一把path设置为/
下面附cookie的CRUD代码:3d

var cookie = {
        /**
         * 设置cookie
         * @param name cookie的名称
         * @param value cookie的值
         * @param day cookie的过时时间
         */
        setCookie: function (name, value, day) {
            if (day !== 0) {     //当设置的时间等于0时,不设置expires属性,cookie在浏览器关闭后删除
                var expires = day * 24 * 60 * 60 * 1000;
                var date = new Date(+new Date() + expires);
                document.cookie = name + "=" + escape(value) + ";expires=" + date.toUTCString()+";path=/";
            } else {
                document.cookie = name + "=" + escape(value)+";path=/";
            }
        },
        /**
         * 获取对应名称的cookie
         * @param name cookie的名称
         * @returns {null} 不存在时,返回null
         */
        getCookie: function (name) {
            var arr;
            var reg = new RegExp("(^| )" + name + "=([^;]*)(;|$)");
            if (arr = document.cookie.match(reg))
                return unescape(arr[2]);
            else
                return null;
        },
        /**
         * 删除cookie
         * @param name cookie的名称
         */
        delCookie: function (name) {
            this.setCookie(name, ' ', -1);
        }
    }
相关文章
相关标签/搜索