为什么我不能删除此Cookie?

时间:2020-03-05 18:51:15  来源:igfitidea点击:

好的,这是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仍然存在。那么,有人知道为什么吗?

解决方案

回答

我们是否尝试过使用"; expires =星期四,1970年1月1日格林尼治标准时间"?

回答

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

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

更新

刚刚有了一个快速的Google,看来浏览器设置也可能有问题。我认为问题不是这里的代码,它更有可能是其他问题。我建议尝试上述作为PoC,我们可以从那里开始。 :)

回答

我大约一周前在博客上发布了js cookie util。这对我所有的" 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);
  }
};

回答

  • 我们是否检查过客户端和服务器端Cookie域以及路径以确保它们相同?
  • 一个cookie安全吗,另一个cookie不安全吗?
  • 除此之外,我会怀疑服务器/客户端的时钟同步问题,正如艾伦德(Erlend)所建议的那样。

回答

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

回答

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

回答

我们必须在创建Cookie的相同路径下删除Cookie。
因此,请使用path = /创建cookie,并同时使用path = /删除它。

回答

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