今天遇到一個cookie的問題: 名叫username的,域爲www.umiwi.com的cookie無法刪除,導致用戶登錄以後無法退出。搞了半天終於發現問題所在:原來是我關於cookie的基礎知識沒搞清楚 。。。。
Cookie不僅僅有名字和值兩個屬性,還有域(domain),過期時間(expires),路徑(path)等屬性。 其中,不同的域、不同的路徑下可以存在同樣名字的cookie。 比如這個頁面: 用鼠標戳我
一般我們刪除cookie的方法是用一個同樣名字、過期時間爲過去某個時候的Cookie覆蓋之。 這時就一定要搞清楚你要刪除的cookie的域和路徑,Cookie域和路徑要一樣才能被覆蓋。 否則產生的效果就是那個想要被刪除的Cookie具有神奇的生命力,無法被清除~~~
另外,我發現在設置Cookie的時候,如果沒有指定域名,那麼設置的這個cookie的域默認爲當前域,比如www.umiwi.com。 如果設置的時候指定了某個域,那麼瀏覽器存的時候會自動在前面加.。比如PHP代碼:setcookie('test','a',0,'www.umiwi.com'); 那麼 瀏覽器裏面存的Cookie的域爲.www.umiwi.com。所以,最好的方式是設置Cookie的時候怎麼寫的,刪除的時候就怎麼寫。 要不就會出現我遇到的情況: 明明瀏覽器裏看有 username=longbill,域爲www.umiwi.com的Cookie,但是在php裏寫setcookie('username','',time()-1000,'www.umiwi.com','/'); 無法刪除那個Cookie。 原因就是我刪Cookie的操作其實上是發了一個新的名叫username、值爲空、過期時間爲過去1000秒、域爲.www.umiwi.com、路徑爲/的Cookie。這個Cookie發到瀏覽器馬上就過期了,什麼也看不到。而我要刪除的在http://www.umiwi.com/上的cookie還活的好好的。。。
原來是刪除Cookie的代碼中沒有加 路徑(path)
原:
document.cookie = "sdmenu_" + encodeURIComponent(this.menu.id) + "=" + states.join("") + "; expires=" + d.toGMTString() + "; path=/";
新:
var date=new Date();
date.setTime(date.getTime()-10000);
document.cookie=name+"=v; expire="+date.toGMTString()+"; path=/";
除了路徑(path),可能還有域等其它情況,保險的方式就是 設置Cookie時是什麼樣式,刪除時就應該是什麼樣式,加上expire屬性就行了
原文鏈接:http://php.js.cn/blog/delete-cookie/
ps: 其實 jquery中提供了清除cookie的插件 jquery.cookie.js
$.cookie('usernameA', '');
$.cookie('passwordA', '');
將你set到cookie中的值重新賦值就ok了,很簡單的~