Путаница с тайм-аутом сеанса - session.setMaxInactiveInterval(0)
-
26-12-2019 - |
Вопрос
Я новичок в JEE, и это меня смущает.В соответствии с HttpSession.html#setMaxInactiveInterval(интервал целого числа) документация
Ан
interval
значениеzero
или меньше указывает на то, что сеанс никогда не должен истекать по тайм-ауту.
но, согласно моему учебнику (которому уже несколько лет, поэтому я ожидаю, что это не всегда будет правильно), использование нуля в качестве аргумента должно привести к немедленному тайм-ауту сеанса.
Этот код
public class Test extends HttpServlet {
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html");
response.setCharacterEncoding("utf-8");
PrintWriter out = response.getWriter();
HttpSession session = request.getSession();
session.setAttribute("foo", 42);
session.setMaxInactiveInterval(0);
out.println(session.getAttribute("foo"));//problem here
}
}
используемый в Glassfish 4.0, похоже, подтверждает теорию из учебника, а не из более новой официальной документации, поскольку он возвращает Статус HTTP 500 — внутренняя ошибка сервера с сообщением об ошибке
java.lang.IllegalStateException: getAttribute: Session already invalidated
Что здесь происходит?Это ошибка Glassfish 4.0 или неправильная документация?А может быть есть третий вариант?
ПС.Этот код работает должным образом с отрицательными значениями (сеанс не признается недействительным), и я использую -1
вместо 0
в моем коде.мне просто интересно, что не так 0
.
Решение
А Спецификация сервлета глава о состояниях тайм-аутов сеанса
По определению, если период времени для сеанса установлен на -1, сеанс никогда не истекает.
Так что GlasshFish, кажется, позаботился об этом.Я не могу найти в спецификации ссылку, в которой говорится, что то же самое должно быть верно для значения 0
с setMaxInactiveInterval()
.Однако там говорится
А
session-config
Определяет параметры сеанса для этого веб -приложения.Подэлементsession-timeout
Определяет интервал времени сеанса по умолчанию для всех сеансов, созданных в этом веб -приложении.Указанное время должно быть выражено через целое количество минут. Если время ожидания равно 0 или меньше, контейнер гарантирует поведение сеансов по умолчанию никогда не бывает.Если этот элемент не указан, контейнер должен установить период времени по умолчанию.
Другие советы
Это уже тайм-аут и аннулирование
session.setMaxInactiveInterval(0); // mean inactive immediately
Итак, это правильное сообщение об ошибке.(Для получения дополнительной информации обратитесь к первой книге.)
Вы пытаетесь получить доступ к несуществующему значению объекта.оно уже уничтожено