Постоянные куки от сервлета в IE - PullRequest
6 голосов
/ 12 декабря 2008

У меня есть файл cookie, сгенерированный из сервлета, и я хотел бы быть постоянным - то есть установить cookie, закрыть IE, запустить его обратно и при этом иметь возможность читать cookie. Код, который я использую, следующий:

HttpServletResponse response = 
    (HttpServletResponse) FacesContext.getCurrentInstance()
    .getExternalContext().getResponse();

Cookie cookie = new Cookie("someKey", "someValue");
cookie.setMaxAge(7 * 24 * 60 * 60);
response.addCookie(cookie);

Это прекрасно работает в Firefox, но в IE 6/7 cookie не сохраняется между перезапусками браузера. Я проверил все, что могу придумать в своих настройках, но не могу понять, что может привести к удалению куки. Насколько я знаю, вызов setMaxAge с положительным номером делает cookie постоянным. Есть идеи, почему это может пойти не так?

Редактировать

Я проверил, используя трюк с дополнительной информацией, предложенный Олафом, что cookie пытается быть установлен как сеансовый cookie, а не как постоянный cookie; максимальный возраст установлен на «конец сеанса». Так что не похоже, что максимальный возраст установлен для IE - я убедился, что в Firefox максимальный возраст установлен правильно. Я до сих пор понятия не имею, что происходит.

Ответы [ 6 ]

6 голосов
/ 27 июля 2009

Я ничего не знаю о Java или сервлетах, но IE сохранит cookie только в том случае, если у него есть дата Expires, установка max-age недостаточна, IE продолжит обрабатывать его как cookie сессии.

1 голос
/ 10 декабря 2009

Этот http://www.mail-archive.com/users@tomcat.apache.org/msg52249.html имеет ответ, но на самом деле не объясняет почему.

То есть, кодируя @ (что является недопустимым символом в файлах cookie версии 0), для файла cookie, отправляемого в ответе, устанавливается версия 0 (приемлемо для IE), а не 1 (другой формат и, следовательно, недопустимый IE) .

Моя проблема была такой же. Мы были Base64, кодирующей наше значение cookie и отправляющей его вниз. Тем не менее, Base64 содержит символы, такие как '=' ..., что снова запрещено в версии 0 и, следовательно, неприемлемо для IE.

Для меня остается загадка: какая-то часть стека достаточно умна, чтобы признать, что значение cookie недопустимо в качестве файла cookie версии 0, и решает отправить ответ в виде файла cookie версии 1 (включая явную версию). число, «недопустимые» символы, поле max-age, а не expires, и т. д.) Я не знаю, принимает ли решение Tomcat, Faces, Spring или javax.servlet версию.

Итог: кодировка URI для значения cookie гарантирует, что cookie, установленный в браузере, имеет версию 0 и поэтому сохраняется в IE.

1 голос
/ 12 декабря 2008

Несколько предложений.

  1. Вы используете fqdn для доступа к сайту?
  2. используйте fiddler , чтобы проверить, как cookie выглядит в ответе http.
  3. Проверьте, успешно ли хранятся файлы cookie на других сайтах в Интернете.
0 голосов
/ 08 апреля 2014
 try{
        encodedString = URLEncoder.encode(s, "UTF-8");
    } catch (UnsupportedEncodingException e) {}

    return encodedString;`a`
}
public static String decodeString(String s) {
    String decodedString = s;

    try{
        decodedString = URLDecoder.decode(s, "UTF-8");
    } catch (UnsupportedEncodingException e) {}

    return decodedString;
}
0 голосов
/ 15 ноября 2010

У меня была похожая проблема с IE8, за исключением того, что cookie сохранялся при использовании http, но не при использовании https. Решение «Интеллектуальной черепахи» сработало для меня, так как у меня было «=» и другие символы, которые его облажали. До того, как я закодировал файл cookie https, он показывал, что срок его действия истекает в конце сеанса. После кодирования значения оно истекло с максимальным значением, которое я передал. Вот методы, которые я использовал для кодирования / декодирования значения cookie перед установкой и после его получения:

public static String encodeString(String s) {
    String encodedString = s;

    try{
        encodedString = URLEncoder.encode(s, "UTF-8");
    } catch (UnsupportedEncodingException e) {}

    return encodedString;
}
public static String decodeString(String s) {
    String decodedString = s;

    try{
        decodedString = URLDecoder.decode(s, "UTF-8");
    } catch (UnsupportedEncodingException e) {}

    return decodedString;
}
0 голосов
/ 14 декабря 2008

Поскольку я не пользуюсь окнами, это некоторая слабость памяти: если вы устанавливаете в своих настройках файлов cookie IE «запрашивать разрешение» каждый раз, когда устанавливается файл cookie, - не показывает ли он, как долго файл cookie должен быть действительным ? Кроме того, вы можете добавить сайт в другую зону безопасности (локальную или как бы там ни называли), чтобы получить совершенно другие настройки и затем повторить попытку.

Надеюсь, это поможет ...

...