原來我一直不懂cookie


做前端已經兩年了,卻很少涉及到cookie方面的開發,也非常少關注cookie方面的知識,所以理解cookie非常淺顯,

先說下自己淺顯的理解吧:

cookie是基於http協議,cookie就是限制性的存儲字符串的,我們可以通過document.cookie來存儲字符串。

而最近手頭上有個項目上涉及到有關於cookie的操作,即登錄與退出,

對於這個需求,邏輯很簡單

1.登錄前的cookie檢查

2.登錄取的后端數據,再存到cookie

3.退出登錄,清楚cookie.

這里面除了邏輯之外,涉及到了cookie取值和設值的問題。

這里我用到了jquery的第三方插件$.cookie來取值和設置。

根據之上的邏輯與$.cookie來取值和設值,這個任務很快就完成了,在本地apache測試沒有問題。

接着就提交測試了,想不到問題馬上出現了,目前的網站是a.xxx.com;而我們的另一個二級域名的網站b.xxx.com也有登錄,即兩個網站是可以設置document.domain="xxx.com"

在網站b.xxx.com登錄成功后,已經寫了個$.cookie("userid"),  在控制台打document.cookie="userid=112343",

第一次進a.xxx.com貌似是對的,因為$.cookie("userid")有值,所以也會進入已經登錄狀態,但點退出登錄后,

再進b.xxx.com后還是登錄狀態。難道是cookie沒有共享, 看下document.cookie="userid=112343;userid=0";

在這里很奇怪,在a.xxx.com退出登錄時,已經設置了$.cookie("userid",0),但並沒有覆蓋之前的userid,而是追加了一個新的userid=0,之前的userid還存在。

看來清除cookie不是重新設置值這么簡單。

在網上查了下資料,即清除cookie還需要增加個過期時間,即小過現在的時間就可以了,代碼就修改成

$.cookie("userid", 0 , {expirs:new Date() -1000});

但還是沒達到效果。

在這里也科普了下cookie的組成, cookie其實是由name,value, expires,path,domain等屬性組成的,

如果寫cookie的時候設置了path與domain, 則清除cookie時也需要設置相同的path,domain,  如果沒有設置domain, 即取當前的location.host

所以原因找到了。

當b.xxx.com寫cookie時設置了domain:xxx.com,和path:''/",   而我在a.xxx.com清cookie時只是設置了value和過期時間,並沒有寫domain和path, 所以並

沒有清除原來的userid ,而是生成了新的userid,這個userid默認的domain為a.xxx.com,只是因為有過期時間,馬上就消除了。但並沒有清除之前的userid.

所以改代碼為

$.cookie("userid",0,{expires:new Date()-1000, domain:"7k7k.com", path:"/"} 

 

即清除了之前的userid.

 

總結:

1.cookie不是簡單的name和value兩個屬性,還有expires,domain,path等屬性,這個可以專門找cookie的概念來熟悉。

2.清cookie必須與設cookie時的domain與path一致。否則就不會清除而是追加。

cookie應該還有其他的很多方面的問題,希望大家可以幫筆者補充。

看來在技術之路上很多東西是需要自身實踐的,自己感覺和親自做過是兩碼事,要想成為高手,必須踩足夠多的坑,有過足夠多的總結才行。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM