Как эффективно уничтожить «сеанс» в сервлете Java?

Сервлет, над которым я работаю, имеет переменную session.

Я пробовал session.invalidate();, это, похоже, уничтожило сеанс, но когда я делаю перенаправление, подобное response.sendRedirect("restanes.jsp");, это дает мне HTTP Status 500 ошибку с этой строкой:

java.lang.IllegalStateException: getAttribute: Session already invalidated

Это ожидается, так как я пытался уничтожить сеанс.

Но почему страница не может перенаправить? На той же странице в другом месте я успешно перенаправил.

Как я могу уничтожить сеанс и успешно перенаправить?

Фрагмент кода:

if(request.getParameter("logout") != null ){  
        session.invalidate();
        response.sendRedirect("restanes.jsp");
}

Обновление: все, что мне нужно было сделать, это return; после response.sendRedirect("restanes.jsp");. Искренняя благодарность BalusC.


person Sushan Ghimire    schedule 20.12.2012    source источник
comment
Ошибка 500, скорее всего, вызвана страницей после редиректа (restanes.jsp). Можете ли вы получить больше информации из журналов?   -  person Thilo    schedule 20.12.2012
comment
Наличие/отсутствие сеанса не должно влиять на перенаправление.   -  person Dave Newton    schedule 20.12.2012
comment
@Thilo, если я удалю session.invalidate(); бит перенаправления работает нормально. Когда я возвращаю эту строку, ошибка также указывает на переменную сеанса, которую я установил ранее.   -  person Sushan Ghimire    schedule 20.12.2012
comment
Вы уверены, что страница, на которую вы перенаправляетесь, не требует информации из сеанса, который вы аннулировали?   -  person Perception    schedule 20.12.2012
comment
@ Восприятие Ну .. это не так. Это потому, что у него есть проверка. Если сеанса нет, он показывает другое поведение. Только что я попытался перенаправить на страницу, на которой вообще нет сеанса, и все та же проблема.   -  person Sushan Ghimire    schedule 20.12.2012
comment
Что, если у него есть новый сеанс, который не был инициализирован (и в нем отсутствует что-то, что было в старом сеансе)?   -  person jahroy    schedule 20.12.2012
comment
@MrGhimire - но есть сеанс. Просто он недействителен.   -  person Perception    schedule 20.12.2012


Ответы (2)


Вам нужно вернуться из метода после отправки редиректа.

if (request.getParameter("logout") != null) {  
    session.invalidate();
    response.sendRedirect("restanes.jsp");
    return; // <--- Here.
}

В противном случае код будет продолжать выполняться и столкнется с некоторым методом session.getAttribute() ниже в блоке, вызывающим именно это исключение. По крайней мере, это наиболее вероятная причина проблемы, описанной до сих пор и основанной на том факте, что это довольно распространенная ошибка стартера. См. также, например. этот ответ.

person BalusC    schedule 20.12.2012
comment
Вполне возможно, что это действительно то, что происходит - в любом случае это имеет больше смысла. Если ОП подтвердит, я проголосую и удалю свой ответ. - person Perception; 20.12.2012
comment
@BalusC Я специалист по PHP и ожидал, что перенаправление будет работать идеально (без возврата). Я тестировал с возвратом; и работает. Скромное спасибо. - person Sushan Ghimire; 21.12.2012
comment
Пожалуйста. Обратите внимание, что то же самое относится и к PHP. Вам нужно поместить exit; после header('Location: foo.php'); внутри блока if, чтобы предотвратить запуск остатка кода (хотя это не обязательно может повредить PHP; веб-браузер все равно проигнорирует ненужный извлеченный HTML). - person BalusC; 21.12.2012

Ваш код в порядке

if(request.getParameter("logout") != null )
{  
  session.invalidate();
  response.sendRedirect("restanes.jsp");
}

но убедитесь, что страница перенаправления не содержит никаких атрибутов сеанса. Внутренняя ошибка 500 со страницы "restanes.jsp". поработайте с перенаправленной страницей и активностью сессии.

person Pushpendra    schedule 19.12.2013
comment
Как указали OP и BalusC; его код (не уверенный в поле по имени) не в порядке. Требуется исправление, указанное в ответе BalusC. - person Agi Hammerthief; 23.01.2018