8

好的,这是 411 - 我的 Global.asax.cs 文件中有以下事件处理程序:

private void Global_PostRequestHandlerExecute(object sender, EventArgs e)
{
   if (/* logic that determines that this is an ajax call */)
   {
      // we want to set a cookie
      Response.Cookies.Add(new HttpCookie("MyCookie", "true"));
   }
}

该处理程序将在 Ajax 请求期间运行(由于我正在使用的 Ajax 框架),以及在其他时间 - if 语句的条件过滤掉非 Ajax 事件,并且工作正常(它不相关在这里,所以为了简洁起见,我没有包括它)。

我们可以说这很好 - cookie 已设置,我可以在客户端上读取它,并且一切都很好。

现在是让我发疯的部分。

这是我用来删除 cookie 的 JavaScript 函数:

function deleteCookie(name) {
   var cookieDate = new Date();
   cookieDate.setTime(cookieDate.getTime() - 1);
   document.cookie = (name + "=; expires=" + cookieDate.toGMTString());
}

所以,当然,在设置 cookie 之后的某个时间点,我会像这样删除它:

deleteCookie("MyCookie");

只是,这不起作用;cookie 仍然存在。那么,有人知道为什么吗?

4

8 回答 8

9

you have to delete your cookie at the same path where you created it. so create your cookie with path=/ and delte it with path=/ as well..

于 2008-10-02T16:25:06.207 回答
4
  • 您是否检查了客户端和服务器端的 cookie 域和路径以确保它们相同?
  • 一个cookie安全而另一个不安全吗?
  • 除此之外,正如 Erlend 建议的那样,我怀疑服务器/客户端时钟同步问题。
于 2008-09-11T16:05:22.973 回答
2

你试过用;expires=Thu, 01-Jan-1970 00:00:01 GMT吗?

于 2008-09-11T10:55:36.803 回答
2

奇怪..您粘贴的代码几乎是逐字记录的:http ://www.quirksmode.org/js/cookies.html工作正常..

我知道您正在使用 Ajax,但是您是否尝试过将其快速敲入服务器端代码以查看是否有效?这可能有助于确定是 JS 问题还是其他问题(例如 cookie 上的神秘文件锁定)?

更新

刚用了谷歌,看起来浏览器设置也可能有问题。我不认为你的问题是这里的代码,它更有可能是别的东西。我建议尝试将上述作为 PoC,我们可以从那里开始。:)

于 2008-09-11T11:21:42.407 回答
2

大约一周前,我在我的博客上发布了一个 js cookie 实用程序。这在所有“A 级”浏览器上都对我有用。

var CookieUtil = {
  createCookie:function(name,value,days) {
    if (days) {
        var date = new Date();
        date.setTime(date.getTime()+(days*24*60*60*1000));
        var expires = "; expires="+date.toGMTString();
    }
    else var expires = "";
    document.cookie = name+"="+value+expires+"; path=/";
  },
  readCookie:function(name) {
    var nameEQ = name + "=";
    var ca = document.cookie.split(';');
    for(var i=0;i < ca.length;i++) {
        var c = ca[i];
        while (c.charAt(0)==' ') c = c.substring(1,c.length);
        if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
    }
    return null;
  },
  eraseCookie:function(name) {
    createCookie(name,"",-1);
  }
};
于 2008-09-11T14:46:01.103 回答
1

此外,如果在创建过程中指定了 cookie 域,我发现您在尝试删除(过期)时还必须指定 cookie 域。

于 2010-09-15T01:26:13.310 回答
0

我们确定没有将 Cookie 设置为 HttpOnly 的代码(我们没有遗漏上面的任何内容)吗?HttpOnly 属性将阻止(现代)浏览器修改 cookie。我很想看看你是否可以像 Rob 建议的那样在服务器端杀死它。

于 2008-09-13T07:22:15.990 回答
0

我假设你在浏览器端调用这个 javascript。您使用的是哪个浏览器,您如何查看 cookie 以确认它仍然存在?

于 2008-10-02T16:15:00.197 回答