Атрибут «Истекает» указывает на дату в прошлом

#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.