Подтвердить что ты не робот

Cookie устанавливается дважды; как удалить дубликат?

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

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

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

  • Как мне остановить это/почему это происходит в первую очередь?
  • Как я могу исправить вещи для любых пользователей, у которых уже есть застрявший файл 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). Любая помощь очень ценится.

Update:

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

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

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

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

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

  • Firefox - Теперь работает правильно, hooray! Работал правильно один раз, а затем сломался, boo!
  • Chrome - без изменений
  • IE - Кажется, нужно хранить отдельные куки для каждого URL-адреса, поэтому URL-адрес в стиле Facebook запоминает одно состояние, а стандартный URL-адрес запоминает другое состояние. Оба обновления правильно и независимо друг от друга. Это своего рода фанки, но все же лучше, чем застрявшее/сломанное состояние.
4b9b3361

Ответ 1

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

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: это был отладочный опыт bizzare, где мне удалось установить 4 layoutState куки файлы, перейдя по пути и домену.

Ответ 2

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

Ответ 3

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

Ответ 4

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

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

Ответ 5

Снова проблема остается после определения проблемы и предотвращения предотвращения путем правильной настройки файла 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 или даже каждый раз после загрузки документа в зависимости от вашего приложения.

Ответ 6

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

setcookie('YourCookieName','yes', time() + 400, '/');