Выход из JSF с использованием session.invalidate не очищает текущее имя пользователя? - PullRequest
9 голосов
/ 04 февраля 2011

В моем приложении 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 (), чем просто проверка имени пользователя?

Спасибо! Rob

Ответы [ 2 ]

16 голосов
/ 04 февраля 2011

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

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

0 голосов
/ 17 октября 2014

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

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

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

...