Вопрос

Я новичок в 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

Итак, это правильное сообщение об ошибке.(Для получения дополнительной информации обратитесь к первой книге.)

Вы пытаетесь получить доступ к несуществующему значению объекта.оно уже уничтожено

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top