Ответ 1
Когда вы устанавливаете значение cookie с одним из следующих значений, как указано в Cookie#setValue()
,
При использовании файлов cookie версии 0 значения не должны содержать пробелов, скобок, круглых скобок, знаков равенства, запятых, двойных кавычек, косых черт, вопросительных знаков, знаков, двоеточий и точек с запятой. Пустые значения могут не совпадать со всеми браузерами.
тогда средний контейнер будет неявно установить cookie на версию 1 (RFC 2109 spec) вместо стандартной версии 0 (Спецификация Netscape). Поведение не определяется API-интерфейсом Servlet, контейнер может его реализовать (он может, например, выбросить IllegalArgumentException
). Насколько я знаю, Tomcat, JBoss AS и Glassfish ведут себя одинаково в отношении неявного изменения версии файла cookie. По крайней мере, для Tomcat и JBoss AS это следствие исправлений для этой проблемы безопасности.
Файл cookie версии 1 выглядит следующим образом:
name="value with spaces";Max-Age=3600;Path=/;Version=1
в то время как файл cookie, совместимый с версией 0, выглядит так:
name=value%20with%20spaces;Expires=Mon, 29-Aug-2011 14:30:00 GMT;Path=/
(обратите внимание, что для версии 0 допустимо значение URL-адреса)
Важно отметить, что Microsoft Internet Explorer не поддерживает файлы cookie версии 1. Даже не текущая версия IE 11. Он будет интерпретировать цитаты, являющиеся частью всего значения cookie, и будет обрабатывать и возвращать это соответственно. Он не поддерживает атрибут Max-Age
, и он полностью игнорирует его, что приводит к тому, что время жизни cookie по умолчанию совпадает с сеансом браузера. По-видимому, вы использовали IE для проверки обработки файлов cookie вашего webapp.
Для поддержки MSIE вам действительно нужно URL-кодирование и URL-декодирование значения cookie самостоятельно, если оно содержит возможно символы, которые являются недопустимыми для версии 0.
Cookie cookie = new Cookie(name, URLEncoder.encode(value, "UTF-8"));
// ...
и
String value = URLDecoder.decode(cookie.getValue(), "UTF-8"));
// ...
Чтобы поддерживать cookie версии 1 для мировой аудитории, вы действительно будете ждать, пока Microsoft исправит отсутствие поддержки MSIE и что браузер с исправлением стал основным. Другими словами, это займет много времени (обновление: на данный момент, спустя 5 лет, похоже, что это никогда не произойдет). Между тем вам лучше всего придерживаться совместимых файлов версии 0.