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-адрес запоминает другое состояние. Оба обновления правильно и независимо друг от друга. Это своего рода фанки, но все же лучше, чем застрявшее/сломанное состояние.
Ответы
Ответ 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, '/');