Выход из JSF с использованием session.invalidate не очищает текущее имя пользователя?

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

public String getLoggedInUsername() {
  return FacesContext.getCurrentInstance().getExternalContext().getRemoteUser();
}

... и я проверяю, вошел ли пользователь вот так...

public boolean isSignedIn() {
  return (getLoggedInUsername() != null);
}

... и когда пользователь выходит из системы, я делаю это...

public String doLogout() {
  FacesContext facesContext = FacesContext.getCurrentInstance();
  HttpSession httpSession = (HttpSession)facesContext.getExternalContext().getSession(false);
  httpSession.invalidate();
  return "main";
}

Моя проблема заключается в том, что после doLogout() getLoggedInUsername() по-прежнему возвращает имя пользователя, который вошел в систему. Что я должен сделать, чтобы убедиться, что getRemoteUser() возвращает значение null после выхода из системы?

В качестве альтернативы, есть ли лучший способ получить, если isSignedIn(), чем просто проверка имени пользователя?

Спасибо! Роб


person Community    schedule 04.02.2011    source источник
comment
Вы сами отлаживали задействованные методы или сами догадались/пришли к выводу, основываясь на поведении веб-браузера? Страница может быть просто запрошена из кеша браузера...   -  person BalusC    schedule 04.02.2011
comment
Да, я отладил это. Я нажимаю метод doLogout(), после его завершения я нажимаю getLoggedInUsername(), и он возвращает имя пользователя, который вошел в систему (даже после запуска session.invalidate). Есть идеи?   -  person    schedule 04.02.2011
comment
Я не знаю, отправляю ли я перенаправление. :) Я думаю, что я использую поведение по умолчанию, в doLogOut() браузер покидает любую страницу, на которой я был, и показывает страницу main.jsf (кстати, для просмотра которой вам не нужно входить в систему). ). Это помогает?   -  person    schedule 04.02.2011
comment
Да я уже догадался. Я удалил комментарий и переместил его в ответ до того, как вы прокомментировали. Это перенаправление, когда URL-адрес в адресной строке браузера меняется на целевой URL-адрес вместо того, чтобы придерживаться URL-адреса, на который отправляется форма.   -  person BalusC    schedule 04.02.2011


Ответы (2)


Убедитесь, что вы перенаправляете запрос после аннулирования сеанса. Принципал-пользователь разрешается на основе атрибута сеанса. Поэтому, когда вы просто перенаправляетесь на целевую страницу (как это происходит по умолчанию в случае навигации JSF), она все еще будет там на целевой странице, поскольку она использует та же ссылка HttpSession. Перенаправление предписывает веб-браузеру запустить новый HTTP-запрос, тем самым вынуждая сервер воссоздать ссылку HttpSession на основе нового запроса.

Добавьте <redirect/> в случай навигации, чтобы заставить JSF отправить перенаправление. Или, если вы уже используете JSF 2.0, добавьте ?faces-redirect=true к итоговому значению.

person BalusC    schedule 04.02.2011

После вызова "session.invalidate();" , добавьте "request.logout();".

Метод делает недействительным объект сеанса, просто очищает данные сеанса.

Метод выхода из системы для объекта запроса устанавливает null как значение, возвращаемое при вызове getUserPrincipal, getRemoteUser и getAuthType по запросу.

person Igor    schedule 17.10.2014