Почему я не могу удалить этот файл cookie?

Хорошо, вот 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 установлен, я могу прочитать его на клиенте, и до этого момента все в порядке.

Теперь о части, которая сводит меня с ума.

Вот функция JavaScript, которую я использую для удаления файла cookie:

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

Итак, конечно, в какой-то момент после установки файла cookie я удаляю его следующим образом:

deleteCookie("MyCookie");

Только это не работает; файл cookie все еще существует. Итак, кто-нибудь знает, почему?


person Jason Bunting    schedule 11.09.2008    source источник
comment
Пират заходит в бар, и бармен говорит: «Простите, капитан, но как у вас корабельный штурвал прилип к вашей промежности?» Не знаю, говорит пират, но это сводит меня с ума!   -  person Jason Bunting    schedule 11.09.2008
comment
Извините, эта шутка может не иметь смысла с точки зрения контекста - когда я написал «А теперь» для части, которая сводит меня с ума в исходном вопросе, я не мог не думать об этой шутке... она хорошая. :П   -  person Jason Bunting    schedule 11.09.2008
comment
Вы должны принять ответ @Andreas Petersson.   -  person boatcoder    schedule 24.09.2013


Ответы (8)


вы должны удалить свой файл cookie по тому же пути, по которому вы его создали. поэтому создайте свой файл cookie с помощью path=/ и удалите его с помощью path=/.

person Andreas Petersson    schedule 02.10.2008
comment
У меня была такая же проблема, когда несколько файлов cookie не удалялись - добавьте / определенно исправили это для меня. К сожалению, я удалил его, проверив, был ли он удален, если он не был удален, попробуйте удалить снова с помощью /.... сумасшедший! Это было протестировано в IE7 и FF3.5. - person Goyuix; 11.01.2010

  • Вы проверили домены и пути файлов cookie на стороне клиента и на стороне сервера, чтобы убедиться, что они одинаковы?
  • Является ли один файл cookie безопасным, а другой нет?
  • Кроме этого, я бы подозревал проблемы с синхронизацией часов сервера/клиента, как предполагает Эрленд.
person Robert J. Walker    schedule 11.09.2008
comment
Код js берет текущее время компьютера, локальное для того места, где хранится файл cookie, а затем сохраняет файл cookie с истечением срока действия незадолго до этого (т. Е. В прошлом, насколько это касается локального компьютера). Поскольку браузер использует время локального компьютера для истечения срока действия файлов cookie, синхронизации времени быть не должно... - person Adam Davis; 11.09.2008
comment
Я собирался предложить также убедиться, что путь (и домен) тоже одинаковый. Так что +1 - person PhiLho; 08.10.2008

Странно. Код, который вы вставили, почти дословно соответствует этому: http://www.quirksmode.org/js/cookies.html, который отлично работает.

Я знаю, что вы используете Ajax, но пробовали ли вы быстро перенести его в код на стороне сервера, чтобы проверить, работает ли это? Это может помочь выяснить, связана ли проблема с JS или чем-то еще (например, блокировка загадочного файла в файле cookie)?

Обновлять

Только что быстро погуглил, похоже, могут быть проблемы и с настройками браузера. Я не думаю, что ваша проблема связана с кодом, скорее всего, это что-то другое. Я бы посоветовал попробовать описанное выше в качестве PoC, и мы можем двигаться дальше. :)

person Rob Cooper    schedule 11.09.2008

Примерно неделю назад я разместил файл js cookie util в моем блоге. Это сработало для меня во всех браузерах класса «А».

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);
  }
};
person Ricky    schedule 11.09.2008
comment
Оставляя нас в недоумении, что является браузером класса A, а что нет :-) - person Oddthinking; 19.11.2008
comment
@Oddthinking Браузер не-А класса: IE6. Браузер класса: все остальное. - person Rap; 17.11.2011

Вы пытались использовать ;expires=Thu, 01-Jan-1970 00:00:01 GMT?

person Erlend    schedule 11.09.2008

Кроме того, если домен cookie был указан во время создания, я обнаружил, что вы также должны указать домен cookie при попытке удалить (срок действия) его.

person just.jimmy    schedule 15.09.2010

Мы уверены, что нет кода, который устанавливает для Cookie значение HttpOnly (мы ничего не упустили выше)? Свойство HttpOnly не позволит (современным) браузерам изменять файл cookie. Мне было бы интересно посмотреть, сможете ли вы убить его на стороне сервера, как предлагает Роб.

person Tyler    schedule 13.09.2008

Я предполагаю, что вы вызываете этот javascript на стороне браузера. Какой браузер вы используете, как вы просматриваете файл cookie, чтобы убедиться, что он все еще там?

person Community    schedule 02.10.2008