#cookies #struts2 #jboss
#файлы cookie #struts2 #jboss
Вопрос:
Я пытаюсь установить файлы cookie для своего сайта. Я использую:
ServletActionContext.getResponse().addCookie(<my cookie instance>);
Максимальное количество файлов cookie установлено на «2592000». Однако… по какой-то неизвестной причине заголовок выглядит так:
Server:Wildfly 8
Set-Cookie:LOCALE=en_GB; path=/scores;
Max-Age=2592000; Expires=Mon, 02-Jun-2014 19:17:54 GMT
Сегодня в соответствии с заголовком:
Date:Sun, 22 Jun 2014 12:20:41 GMT
, поэтому я удивлен, почему поле «Expires» дата указывает на дату в прошлом. У меня совершенно нет идей. Я был бы благодарен за любые подсказки. Может быть, мне нужно что-то настроить?
Редактировать: вот мой метод создания моих файлов cookie:
public Cookie getCookie(final String name, final String value, final int maxAge, final HttpServletRequest request)
{
final Cookie cookie = new Cookie(name, value);
cookie.setMaxAge(maxAge);
cookie.setPath(request.getContextPath());
cookie.setSecure(false);
return cookie;
}
Правка2:
Я только что заметил, что есть разница между форматом заголовка, отправляемым в браузер при использовании Jboss 7. В настоящее время нет максимального возраста — просто вычисленное (и правильное) время истечения срока действия.
Server:Apache-Coyote/1.1
Set-Cookie:LOCALE=en_GB; Expires=Tue, 22-Jul-2014 13:44:00 GMT; Path=/scores
Кажется, что Jboss 8 Wildfly должен быть каким-то образом настроен для вычисления времени истечения срока действия файлов cookie. К сожалению, мне приходится использовать Wildfly.
Комментарии:
1. Покажите, как вы создаете экземпляр cookie.
2. Здесь ничего особенного: конечный файл Cookie cookie = новый файл cookie (имя, значение); cookie.setMaxAge(maxAge); cookie. setPath(request.getContextPath()); cookie.setSecure(false); возвращает cookie;
3. Не публикуйте код в комментариях, отредактируйте вопрос, чтобы предоставить подробности. Делая это для лучшей помощи, быстрее подготовьте SSCCE .
Ответ №1:
Я все еще трачу свое время (сегодня я потерял 8 часов), пытаясь это исправить, но… У меня есть обходной путь (который может помочь кому-то в будущем) и интересный факт.
Строка кода выглядит следующим образом:
ServletActionContext.getResponse().addCookie(newInstance(name, value, maximumAge, request));
Я заменил на это:
protected void set(final String name, final String value, final long maximumAgeInSeconds, final HttpServletRequest request)
{
// ServletActionContext.getResponse().addCookie(newInstance(name, value, maximumAgeInSeconds, request));
ServletActionContext.getResponse().addHeader("Set-Cookie", cookieValue(name, value, maximumAge, request));
}
protected static String cookieValue(final String name, final String value, final long maximumAgeInSeconds, final HttpServletRequest request)
{
final SimpleDateFormat cookieExpiresHeaderFormat = new SimpleDateFormat("EEE, dd-MMM-yyyy HH:mm:ss zzz");
cookieExpiresHeaderFormat.setTimeZone(new SimpleTimeZone(0, "GMT"));
final Date d = new Date();
d.setTime(d.getTime() maximumAgeInSeconds * 1000L);
final String cookieLifeTime = cookieExpiresHeaderFormat.format(d);
return name "=" value "; Expires=" cookieLifeTime "; Max-Age=" maximumAge "; Path=" request.getContextPath();
}
Это работает нормально, и, похоже, я нашел ошибку в Jboss 8 или… любая библиотека, которая преобразует cookies в заголовки.
Если переменная maxAgeInSeconds равна 30 дням, преобразованная в миллисекунды 2592000 * 1000 = 2592000000, перекрывает MAX_INT (который равен 2147483647), поэтому его значение стало «-1702967296»!!!!
Пример:
текущее время: 1403460809297 — 1702967296 = (в секундах) 1401757842
Которая: GMT: Вт, 03 июня 2014 01:10:42 GMT
Вот почему я получаю дату истечения срока действия из прошлого. Кажется, что механизм, преобразующий атрибут максимального возраста объекта Cookie в атрибут «Expires» заголовка Cookie, используя целое число вместо более широкого длинного типа, случайно устанавливает дату истечения срока действия cookie из прошлого. Интересным фактом является то, что проблема относится к IE, но не к Chrome, например, который использует Max-age для внутренних вычислений времени истечения срока действия, исключая время истечения срока действия файла cookie. IE в этом случае опускает значение атрибута Max-Age, принимая уже вычисленное значение атрибута Expires для полученных файлов cookie.