Итак, у меня есть веб-сайт, который использует куки для запоминания текущего состояния макета при посещениях.Все работало замечательно, пока я не добавил на сайт кнопку «Мне нравится» на Facebook, которая генерирует ссылки, которые позволяют пользователям делиться определенным состоянием пользовательского интерфейса (немного запутанно, но на самом деле не имеет отношения к проблеме).
Проблема в том, что когда я захожу на сайт через одну из этих ссылок в Facebook, создается впечатление, что создается вторая копия моего файла 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).Любая помощь очень ценится.
Обновление:
Таким образом, шаги, чтобы надежно воспроизвести ошибку, следующие:
- Посетите сайтпо ссылке в стиле Facebook
- Внесите некоторые изменения в макет и закройте вкладку.
- Посетите сайт по обычному URL .
- Ваш макет с первого посещения должен быть правильно запомнен, поэтому измените некоторые вещи и обновите страницу.Когда страница перезагрузится, ваши изменения больше не будут запоминаться.
Я также заметил, что повторное посещение сайта по URL-адресу в стиле Facebook может очистить / сбросить застрявший cookie-файл.Таким образом, браузер сохраняет отдельный файл cookie для каждого пути URL-адреса или чего-то такого, и не позволяет корневой странице получить доступ к файлу cookie, который был установлен для другого пути URL-адреса.Я подумал, что смогу исправить это, явно установив path=/
в куки, но без кубиков.
Обновление 2:
Я обнаружил, что еслиЯ устанавливаю и путь, и домен файла cookie. У меня во всех браузерах различное поведение:
- Firefox - Теперь работает правильно, ура! Один раз работал правильно, потом сломался, бу!
- Chrome - без изменений
- IE - похоже, что для каждого URL хранятся отдельные файлы cookie, поэтому URL-адрес в стиле Facebook запоминает одно состояние, а стандартный URL-адрес запоминает другое состояние. Оба обновляются правильно и независимо друг от друга. Это немного забавно, но все же лучше, чем застрявшее / сломанное состояние.