Для процесса аутентификации я создаю уникальный токен, когда пользователь входит в систему, и помещаю его в файл cookie, который используется для аутентификации.
Поэтому я бы отправил с сервера что-то вроде этого:
Set-Cookie: token=$2a$12$T94df7ArHkpkX7RGYndcq.fKU.oRlkVLOkCBNrMilaSWnTcWtCfJC; path=/;
Что работает во всех браузерах. Затем, чтобы удалить файл cookie, я отправляю аналогичный файл cookie с expires
полем, установленным на 1 января 1970 года.
Set-Cookie: token=$2a$12$T94df7ArHkpkX7RGYndcq.fKU.oRlkVLOkCBNrMilaSWnTcWtCfJC; path=/; expires=Thu, Jan 01 1970 00:00:00 UTC;
И это отлично работает в Firefox, но не удаляет cookie в IE или Safari.
Итак, как лучше всего удалить cookie (желательно без JavaScript)? Метод установки срока действия в прошлом кажется громоздким. А также почему это работает в FF, но не в IE или Safari?
Ответы:
Отправка того же значения cookie с
; expires
добавлением не приведет к его уничтожению.Сделайте файл cookie недействительным, установив пустое значение и также включив
expires
поле:Обратите внимание, что вы не можете заставить все браузеры удалить cookie. Клиент может настроить браузер таким образом, чтобы файл cookie сохранялся, даже если срок его действия истек. Установка значения, как описано выше, решит эту проблему.
источник
"deleted"
, чтобы избежать путаницы позже с потенциально допустимым значением, равным «удалено»foo=bar; domain=www.example.com
другой файл cookiefoo=qux; domain=.example.com
.На момент написания этого ответа в принятом ответе на этот вопрос, по- видимому, указано, что браузеры не обязаны удалять файл cookie при получении заменяющего файла cookie,
Expires
значение которого находится в прошлом. Это утверждение ложно. УстановкаExpires
в прошлое - это стандартный, соответствующий спецификации способ удаления файла cookie, и пользовательские агенты должны соблюдать его.Использование
Expires
атрибута в прошлом для удаления файла cookie является правильным и является способом удаления файлов cookie, указанным в спецификации. В разделе примеров RFC 6255 говорится:Раздел Требования к пользовательскому агенту включает следующие требования, которые вместе приводят к тому, что файл cookie должен быть немедленно удален, если пользовательский агент получает новый файл cookie с тем же именем, срок действия которого уже прошел.
Пункты 11-3, 11-4 и 12 выше вместе означают, что при получении нового файла cookie с тем же именем, доменом и путем, старый файл cookie должен быть удален и заменен новым файлом cookie. Наконец, приведенный ниже пункт о файлах cookie с истекшим сроком действия дополнительно диктует, что после этого новый файл cookie также должен быть немедленно удален. Спецификация не дает браузерам возможности для маневра в этом вопросе; если бы браузер предлагал пользователю возможность отключить истечение срока действия файлов cookie, поскольку принятый ответ предполагает, что некоторые браузеры это делают, то это будет нарушением спецификации. (Такая функция также мало пригодилась бы, и, насколько мне известно, ее нет ни в одном браузере.)
Почему же тогда ОП этого вопроса обнаружил, что этот подход терпит неудачу? Хотя я не очищал копию Internet Explorer от пыли, чтобы проверить его поведение, я подозреваю, что это произошло из-за
Expires
неправильного формата значения OP ! Они использовали это значение:Однако это синтаксически неверно по двум причинам.
Раздел синтаксиса спецификации диктует, что значение
Expires
атрибута должно бытьСледуя второй ссылке выше, мы находим это в качестве примера формата:
и обнаруживаем, что определение синтаксиса ...
требует, чтобы даты были записаны в формате день месяц год , а не месяц день год , как это использует задающий вопрос.
В частности, он определяет
rfc1123-date
следующее:и определяет
date1
так:а также
не разрешает
UTC
как часовой пояс.Спецификация содержит следующее заявление о том, какие смещения часовых поясов допустимы в этом формате:
Более того, если мы углубимся в исходную спецификацию этого формата даты и времени, мы обнаружим, что в исходной спецификации в https://tools.ietf.org/html/rfc822 в разделе « Синтаксис» указано «UT» (что означает «всемирное время» ) как возможное значение, но не указывает UTC (всемирное координированное время) как действительное. Насколько мне известно, использование "UTC" в этом формате даты никогда не было допустимым; это не было допустимым значением, когда формат был впервые указан в 1982 году, и спецификация HTTP приняла строго более строгую версию формата, запретив использование всех значений «зоны», кроме «GMT».
Если вопрос Аскер здесь вместо этого использовал
Expires
атрибут , как это , то:тогда это предположительно сработало бы.
источник
new Date(0).toUTCString()
Установка истечения срока действия на прошедшую дату является стандартным способом удаления файла cookie.
Вероятно, ваша проблема связана с нестандартным форматом даты. IE, вероятно, ожидает только GMT.
источник
Используйте Max-Age = -1 вместо «Expires». Он короче, менее требователен к синтаксису, и Max-Age в любом случае имеет приоритет над Expires.
источник
Для реализации JAX-RS в GlassFish Jersey я решил эту проблему обычным методом, описав все общие параметры. По крайней мере три параметра должны быть равны: имя (= "name"), путь (= "/") и домен (= null):
И используйте его обычный способ установки cookie:
и удалить cookie:
источник
Max-Age
как самые ранние представимые дату и время, но серверам запрещено отправлять такоеMax-Age
значение. Я предполагаю, что авторы знали как о существующих клиентах, которые не могли справиться, такMax-Age=0
и о серверах, которые их отправили, в то время, когда они писали спецификацию, и пытались смягчить проблему с обеих сторон.