无法删除Cookie的烦恼。。
October/29th 2010

    今天遇到一个cookie的问题: 名叫username的,域为www.umiwi.com的cookie无法删除,导致用户登录以后无法退出。搞了半天终于发现问题所在:原来是我关于cookie的基础知识没搞清楚null 。。。。

    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发到浏览器马上就过期了,什么也看不到。而我要删除的在www.umiwi.com上的cookie还活的好好的。。。

    补充一下HTTP的知识: php里面的header函数发送的header信息默认是不重复的,后面发的会自动覆盖前面的内容。一般说来HTTP请求的header部分也是没有重复信息的,除了Set-Cookie头!  所以,如果我们使用header函数来发送cookie,请注意加第二个参数true。 详见header函数



26954 read 6 comment(s)
#1
  2010年12月09号 15:06       回复
学习了!
#2
  2011年09月26号 19:47       回复
既然您删除的时候  写了 setcookie('username','',time()-1000,'www.umiwi.com','/'); 
和 设置的时候 制定了同样的域  ,为什么还删不掉?
#3
monpub   2013年03月01号 01:14       回复
请问如何删除cookie
#4
longbill   2013年03月02号 23:44       回复
@xyz 好的。
#5
annonce vente commerce   2014年09月12号 21:17       回复
用setcookie删除,还要注意域
#6
过客   上月14号 09:40       回复
function GetCookieValue(name) {
  var cookieValue = null;
  if (document.cookie && document.cookie != '') {
 var cookies = document.cookie.split(';');
 for (var i = 0; i < cookies.length; i++) {
   var cookie = jQuery.trim(cookies[i]);
   //PYYH=USERNAME=steven&PASSWORD=111111&UserID=1&UserType=1
   if (cookie.substring(0, name.length + 1) == (name + '=')) {
 cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
 //USERNAME=steven&PASSWORD=111111&UserID=1&UserType=1
 break;
   }
 }
  }
  return cookieValue;
}
function DelCookie(name) {
  var exp = new Date();
  exp.setTime(exp.getTime() + (-1 * 24 * 60 * 60 * 1000));
  var cval = GetCookieValue(name);
  document.cookie = name + "=" + cval + "; expires=" + exp.toGMTString();
}
添加新的评论
称呼:*
邮件:*
网站:
内容:

Copyright © Longbill 2008-2017 , Designed by EndTo , Powered by EndCMS