Подтвердить что ты не робот

Почему значения cookie с пробелом поступают на стороне клиента с кавычками?

Я - разработчик .NET, начинающий болтаться на Java.

В .NET я могу установить значение cookie для строки с пробелом в ней: new HttpCookie("myCookieName", "my value") - и когда я прочитал это значение на стороне клиента (JavaScript), я получаю ожидаемое значение (мое значение).

Если я делаю то же самое в сервлете Java - new Cookie("myCookieName", "my value"), я получаю значение, включая двойные кавычки ( "мое значение" ).

Почему разница? Я что-то упускаю? Как люди справляются с этим в мире Java? Вы кодируете значение, а затем декодируете на стороне клиента?

4b9b3361

Ответ 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.

Ответ 2

Насколько я знаю, пробелы должны быть закодированы в файлах cookie. Различные браузеры по-разному реагируют на некодированные файлы cookie. Вы должны URL-кодировать свой файл cookie перед его настройкой.

String cookieval = "my value";
String cookieenc = URLEncoder.encode(cookieval, "UTF-8");
res.addCookie(new Cookie("myCookieName", cookieenc));

ASP.NET делает кодировку автоматически, в Java вы должны сделать это самостоятельно. Я подозреваю, что котировки, которые вы видите, добавляются пользовательским агентом.

Ответ 3

Вероятно, это связано с тем, как Java кодирует cookie. Я предлагаю вам попробовать называть setVersion (1) в новом cookie и посмотреть, работает ли это для вас.

Ответ 4

Попробуйте использовать setVersion (0).

HttpCookie cookie = new HttpCookie("name", "multi word value");
System.out.println(cookie.toString());

печатает:

name= "несколько значений слова"

Но после установки

cookie.setVersion(0);
System.out.println(cookie.toString());

печатает:

name = несколько значений слова

Кодирование также является хорошей идеей, но кавычки вокруг значения выглядят как независимая проблема.