为什么网站的cookie有时候获取不到

48次阅读

共计 1469 个字符,预计需要花费 4 分钟才能阅读完成。

工作中有好多同事问我,那个谁,为什么我用网上封装的获取 cookie 的方法却获取不到 自己网站 上的 cookie 呢?

这个问题,我们还要从 document.cookie 说起(其实网上封装的获取 cookie 的方法里面也是用的这个方法),
MDN 上给的文档:

注意,这里给出的解释是获取所有 可从此位置访问 到的 cookie;

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

  • ;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 店拿,显然是拿不到的。

在浏览器中也可以很方便很直观的看到区别:


但是这里也有一个规则,就是 子文件夹下 的页面可以访问 上级页面存下 的 cookie,但 父级文件夹的页面 访问不到 子文件夹下 的页面 创建 的 cookie;
所以,通常我们在设置 cookie 的时候,可以统一把 path 设置为 /
下面附 cookie 的 CRUD 代码:

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);
        }
    }

正文完
 0