Cookie maxAge всегда -1

В настоящее время я внедряю механизм "автоматического входа" в JSF. Реализован фильтр для перехвата каждого запроса и проверки, вошел ли пользователь, прочитав куки.

Когда пользователь впервые входит в управляемый компонент, cookie сохраняется следующим образом:

HttpServletResponse response = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse();
Cookie cookie = new Cookie("myCookieRef", value);
cookie.setPath("/");
cookie.setMaxAge(3600);
response.addCookie(cookie);

Позже, если пользователь выполняет перенаправление, в фильтре я использую следующий код для получения куки:

Cookie[] cookies = request.getCookies();
if (cookies != null) 
{
   for (Cookie cookie : cookies)
   {
       if (name.equals("myCookieRef")) 
       {
          return cookie;
       }
    }
}

запрос является объектом HttpServletRequest.

Проблема в том, что возвращаемый файл cookie всегда имеет значение -1 maxAge и нулевое значение.

Я не знаю, пропускаю ли я что-либо при добавлении куки или мне нужно указать некоторые дополнительные атрибуты для куки?

Большое спасибо.

1 ответ

Решение

Клиент не отправляет атрибуты cookie, кроме имени и значения, обратно на сервер.

См. Также RFC6265 раздел 4.2.2 (выделено мое).

4.2.2. Семантика

Каждая пара cookie представляет собой cookie, сохраняемый агентом пользователя. Пара cookie содержит имя cookie и значение cookie, которые пользовательский агент получил в заголовке Set-Cookie.

Обратите внимание, что атрибуты cookie не возвращаются. В частности, сервер не может определить только из заголовка Cookie, когда истечет срок действия файла cookie, для каких хостов файл cookie действителен, для каких путей файл cookie действителен, или был ли файл cookie установлен с атрибутами Secure или HttpOnly.

Максимальный возраст ведет себя как указано. Более того, если срок его действия истек на стороне клиента, весь файл cookie просто не будет передаваться от клиента к серверу. На стороне сервера вы обычно просто продлеваете срок действия куки при каждом "автоматическом входе", просто устанавливая новый куки с тем же именем / значением и проверяя запросы без входа в систему, если куки есть, или нет, если нет истек или нет.

Если максимальное значение возраста действительно важно для вас по другим причинам, просто сохраните его на своей стороне в некоторой базе данных вместе с уникальным идентификатором cookie (значением cookie).

Что касается null значение, это указывает на проблему в вашем собственном коде, а не в куки. Эта проблема не видна в предоставленной информации, но я уверен, что если вы проверите / отладите ее еще раз, вы обнаружите простую ошибку.

Что касается конкретного функционального требования "автоматического входа в систему", это может быть полезно прочитать: Как реализовать "Оставайтесь в системе", когда пользователь входит в веб-приложение.

Другие вопросы по тегам