爲何網站的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);
        }
    }
相關文章
相關標籤/搜索