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