Cookie устанавливается дважды; как удалить дубликат? - PullRequest
24 голосов
/ 11 апреля 2011

Итак, у меня есть веб-сайт, который использует куки для запоминания текущего состояния макета при посещениях.Все работало замечательно, пока я не добавил на сайт кнопку «Мне нравится» на Facebook, которая генерирует ссылки, которые позволяют пользователям делиться определенным состоянием пользовательского интерфейса (немного запутанно, но на самом деле не имеет отношения к проблеме).

Проблема в том, что когда я захожу на сайт через одну из этих ссылок в Facebook, создается впечатление, что создается вторая копия моего файла cookie макета (например, я вижу два файла cookie с одинаковым именем и разными значениями).Это не было бы слишком ужасно, за исключением того, что значение дублированного куки-файла кажется застрявшим, в сочетании с тем фактом, что когда пользователь возвращается на сайт, браузер запоминает застрявшее значение вместо последнего установленного значения (так что это своего родакак будто есть «хороший» файл cookie, с которым я все еще могу работать, и «плохой» файл, с которым я не могу работать, и браузер любит запоминать «плохой» файл cookie вместо «хорошего» файла cookie).Это нарушает мою функциональность отслеживания / запоминания макета.

Итак, здесь есть два вопроса:

  1. Как мне предотвратить это / почему это происходит в первую очередь?
  2. Как мне все исправитьдля любых пользователей, у которых уже есть застрявший файл cookie (я знаю, что могу просто выбрать новое имя для файла cookie, но я бы предпочел сделать это, найдя способ правильно отсоединить застрявший файл cookie)?

Если я использую консоль разработчика Chrome после посещения страницы в застрявшем состоянии, я вижу, что document.cookie (форматирование добавлено для удобства чтения):

layoutState=[{'id':6,'x':8,'y':1525,'z':4,'url':'undefined'}, {'id':1,'x':625,'y':709,'z':2,'url':'undefined'}, {'id':2,'x':8,'y':37,'z':3,'url':'undefined'}, {'id':3,'x':625,'y':1179,'z':5,'url':'undefined'}, {'id':4,'x':626,'y':37,'z':1,'url':'undefined'}, {'id':5,'x':626,'y':357,'z':1000000,'url':'http://m.xkcd.com/303/'}]; 
WibiyaNotification1=1; 
WibiyaNotification213286=213286; 
WibiyaNotification213289=213289; wibiya756904_unique_user=1; 
JSESSIONID=DONTHIJACKMEPLEASE; 
WibiyaProfile={"toolbar":{"stat":"Max"},"apps":{"openApps":{}},"connectUserNetworks":[null,null,null,null,null,null]}; 
WibiyaLoads=59; 
layoutState=[{'id':6,'x':8,'y':1525,'z':4,'url':'undefined'}, {'id':1,'x':625,'y':709,'z':2,'url':'undefined'}, {'id':2,'x':8,'y':37,'z':3,'url':'undefined'}, {'id':3,'x':625,'y':1179,'z':5,'url':'undefined'}, {'id':4,'x':626,'y':37,'z':1,'url':'undefined'}, {'id':5,'x':626,'y':357,'z':6,'url':'http://m.xkcd.com/303/'}]"

Игнорировать файлы cookie Wibiya и JSESSIONID.Застрявший файл cookie - это первый экземпляр layoutState, а тот, которым я все еще могу манипулировать в JavaScript, - это второй экземпляр layoutState.Вот что я получу, если поменяю некоторые вещи вокруг:

layoutState=[{'id':6,'x':8,'y':1525,'z':4,'url':'undefined'}, {'id':1,'x':625,'y':709,'z':2,'url':'undefined'}, {'id':2,'x':8,'y':37,'z':3,'url':'undefined'}, {'id':3,'x':625,'y':1179,'z':5,'url':'undefined'}, {'id':4,'x':626,'y':37,'z':1,'url':'undefined'}, {'id':5,'x':626,'y':357,'z':1000000,'url':'http://m.xkcd.com/303/'}]; 
WibiyaNotification1=1;
WibiyaNotification213286=213286; 
WibiyaNotification213289=213289; 
wibiya756904_unique_user=1; 
JSESSIONID=DONTHIJACKMEPLEASE; 
WibiyaProfile={"toolbar":{"stat":"Max"},"apps":{"openApps":{}},"connectUserNetworks":[null,null,null,null,null,null]}; 
WibiyaLoads=59; 
layoutState=[{'id':1,'x':8,'y':39,'z':1000000,'url':'undefined'}]

Второй 'layoutState' содержит правильную информацию, которую я хочу, чтобы браузер запомнил.Однако, что на самом деле запоминает браузер, так это ценность первого экземпляра.

Я попытался полностью удалить cookie, что приводит к исчезновению второго экземпляра, но ничего, что я делаю, похоже, не избавляет от первого экземпляра.Я получаю одинаковое поведение во всех основных браузерах (Chrome, Firefox, IE), что заставляет меня подозревать, что я, должно быть, здесь что-то делаю в корне неправильно, но я не уверен, что это такое.

Вы можете просмотретьсам сайт здесь .Или нажмите здесь , чтобы получить к нему доступ по ссылке в Facebook (должен сгенерировать застрявший файл cookie).Любая помощь очень ценится.

Обновление:

Таким образом, шаги, чтобы надежно воспроизвести ошибку, следующие:

  1. Посетите сайтпо ссылке в стиле Facebook
  2. Внесите некоторые изменения в макет и закройте вкладку.
  3. Посетите сайт по обычному URL .
  4. Ваш макет с первого посещения должен быть правильно запомнен, поэтому измените некоторые вещи и обновите страницу.Когда страница перезагрузится, ваши изменения больше не будут запоминаться.

Я также заметил, что повторное посещение сайта по URL-адресу в стиле Facebook может очистить / сбросить застрявший cookie-файл.Таким образом, браузер сохраняет отдельный файл cookie для каждого пути URL-адреса или чего-то такого, и не позволяет корневой странице получить доступ к файлу cookie, который был установлен для другого пути URL-адреса.Я подумал, что смогу исправить это, явно установив path=/ в куки, но без кубиков.

Обновление 2:

Я обнаружил, что еслиЯ устанавливаю и путь, и домен файла cookie. У меня во всех браузерах различное поведение:

  1. Firefox - Теперь работает правильно, ура! Один раз работал правильно, потом сломался, бу!
  2. Chrome - без изменений
  3. IE - похоже, что для каждого URL хранятся отдельные файлы cookie, поэтому URL-адрес в стиле Facebook запоминает одно состояние, а стандартный URL-адрес запоминает другое состояние. Оба обновляются правильно и независимо друг от друга. Это немного забавно, но все же лучше, чем застрявшее / сломанное состояние.

Ответы [ 6 ]

26 голосов
/ 17 апреля 2011

Чувак (tte), в вашем установщике печенья есть несоответствия и ошибка.

1. Убедитесь, что путь и домен правильно установлены

Путь и домен должны быть одинаковыми как для очистки файла cookie, так и для его установки. Смотрите ваш код здесь:

document.cookie = c_name + "=; expires=Fri, 31 Dec 1999 23:59:59 GMT;";

и сравните с:

var c_value=escape(value) + "; expires=" + exdate.toUTCString(); + "; path=/spring; domain=aroth.no-ip.org";

вы увидите, что сеттер имеет их обоих, а удалитель - нет. Вы вызовете хаос.

2. Ох, и эта противная точка с запятой

Во второй строке кода, которую я цитировал выше, точка с запятой вводится в середине выражения конкатенации строк. Сразу после exdate.toUTCString(). Убей это. Убей это ... сейчас.

По крайней мере, в моем Google Chrome мне удалось правильно запустить его, если я установил точку останова на json = "[" + json + "]"; и изменил setCookie до ее запуска.

P / S: Это был странный процесс отладки, когда мне удалось установить 4 layoutState куки, используя путь и домен.

3 голосов
/ 13 апреля 2011

Это может быть слишком просто, но на всякий случай, записаны ли куки для двух разных путей? Если URL-адрес другой, возможно, вы устанавливаете файлы cookie для ограниченного пути, поэтому система будет использовать их по-другому.

1 голос
/ 15 апреля 2011

отметьте Chrome console -> Resources, если ваша страница загружается дважды. Это было бы причиной двойного печенья.

0 голосов
/ 26 мая 2019

Вот решение, помогающее / slash не устанавливать дубликаты cookie с тем же именем

setcookie('YourCookieName','yes', time() + 400, '/');
0 голосов
/ 17 июля 2017

Снова возникла проблема после выявления проблемы и принятия мер предосторожности путем правильной настройки файла cookie.
Вам также необходимо удалить предыдущие неправильно установленные файлы cookie в вашем браузере или в браузере вашего клиента.

Так что соблюдайтефайлы cookie, установленные из инструментов разработчика, и ищут путь и субдомен и помещают их явно в ваш код для удаления.

function eraseCookie(c_name) {
   document.cookie = c_name + "=; expires=Fri, 31 Dec 1999 23:59:59 GMT;";  

}

function eraseCookieWithPathDomain(c_name) {
       document.cookie = c_name + "=; expires=Fri, 31 Dec 1999 23:59:59 GMT;path=/yourpath/to; domain=sub.domain.com";
       //you can remove this function call on your second upload if you are confirm that the previous cookie setter expired
}

Вам может потребоваться вызвать функцию eraseCookieWithPathDomain сразу после eraseCookie или даже каждый раз послезагрузка документа в зависимости от вашей заявки.

0 голосов
/ 12 апреля 2011

Кажется, проблема не в дубликате куки (куки перезаписывают сами себя), а в дублировании ДАННЫХ в вашем куки.

Я думаю, вам придется изменить скрипт, который читает куки и очищатьповторяющееся значение, если оно обнаружено.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...