session.invalidate() не работает на сервере приложений Websphere

У нас есть требование перейти на страницу входа в систему поставщика из основного приложения. Если сеанс действителен, то данные, выбранные в основном приложении, видны на странице поставщика, если мы сохраняем данные в сеансе. Для обработки этого в Tomcat у нас был приведенный ниже код в начале входа в систему поставщика jsp.

request.getSession().invalidate();

Сейчас мы переходим на сервер приложений Websphere. Тот же код не работает в WAS. Мы получаем исключение IllegalStateException. Где-то я читал, что WAS обрабатывает сеанс через куки. Таким образом, IllegalStateException выбрасывается, если сеанс уже признан недействительным.

Я изменил код для WAS, как показано ниже: userId — это идентификатор пользователя, который я сохраняю в сеансе в основном приложении.

if ((request.getSession() != null) && (request.getSession().getAttribute("userId") != null)) { // Old session
    request.getSession().invalidate();
}

Даже если управление находится внутри условия if, оно выдает исключение IllegalStateException. Для нашего требования у меня есть одна альтернатива: удалить все параметры сеанса в начале входа в систему jsp, чтобы ничего не было передано. Но для этого я должен удалить каждый параметр (их почти 20) один за другим. А также в будущем любой новый параметр, который я буду сохранять в сеансе, я должен обновить этот jsp.

Есть ли какое-либо решение, чтобы сначала аннулировать весь сеанс, если он старый?


person BK Elizabeth    schedule 21.09.2013    source источник
comment
Эта строка вызовет исключение, если срок действия сеанса уже истек, если (request.getSession().getAttribute(userId) != null)   -  person SpringLearner    schedule 21.09.2013
comment
Извините, я не упомянул правильно, я также выполняю нулевую проверку для сеанса перед проверкой идентификатора пользователя. Я обновил вопрос.   -  person BK Elizabeth    schedule 21.09.2013
comment
Я бы посоветовал вам выбрать LISTENER.   -  person SpringLearner    schedule 21.09.2013
comment
Нашел еще одно решение по адресу stackoverflow.com/questions/18898141/ Это выглядит более многообещающе.   -  person Hussain Akbar    schedule 19.12.2019


Ответы (3)


Мы решили проблему с помощью следующего кода.

<%@page session="false"%>

<%
   HttpSession session = request.getSession();
   if (session!=null) {
      session.invalidate();
   }
%>

Мы добавили этот код как в основной jsp входа, так и в jsp входа поставщика. Таким образом, каждый раз, когда загружается jsp, автоматическое создание сеанса HTTP исключается (http://docs.oracle.com/cd/A97688_16/generic.903/bp/j2ee.htm#1008677). Затем мы создаем сеанс явно. Этот код теперь отлично работает на сервере приложений Websphere.

person BK Elizabeth    schedule 23.09.2013

После некоторых исследований кажется, что это должно быть в порядке.

  HttpSession session = req.getSession(false);
    if(session == null){
       //valid session doesn't exist
       //do something like send the user to a login screen
    }
    if(session.getAttribute("username") == null){
       //no username in session
       //user probably hasn't logged in properly
    }

    //now lets pretend to log the user out for good measure
    session.invalidate();

Вот ссылка

person Heaven42    schedule 21.09.2013

Я не пробовал, но вы могли бы попробовать что-то подобное.

if ((request.getSession() != null) && 
            (request.isRequestedSessionIdValid()) { 
    request.getSession().invalidate();
}
person Heaven42    schedule 21.09.2013
comment
@Отметьте, в чем польза ** - person SpringLearner; 21.09.2013
comment
@javaBeginner Я только что переформатировал код и на самом деле не читал его - похоже, ответчик пытался выделить его и сделать этот бит жирным - person mmmmmm; 21.09.2013
comment
Извините, парень, у меня хватило **, чтобы выделить эту часть жирным шрифтом... но когда я отформатировал код, он не стал жирным и остался **. - person Heaven42; 21.09.2013