Как аннулировать сеанс в JSF 2.0?
каков наилучший способ аннулировать сеанс в приложении JSF 2.0? Я знаю, что сам JSF не обрабатывает сеанс. До сих пор я мог найти
private void reset() {
HttpSession session = (HttpSession) FacesContext.getCurrentInstance()
.getExternalContext().getSession(false);
session.invalidate();
}
- является ли этот метод правильным? Есть ли способ, не касаясь Сервлетапи?
- рассмотрим сценарий, в котором a
@SessionScoped
UserBean обрабатывает login-выход пользователя из системы. У меня есть этот метод в том же Бобе. Сейчас когда я звонюreset()
метод после того, как я закончу с необходимой БД обновления, что будет на моей текущей сессии областью фасоли? с даже сам Боб хранится вHttpSession
?
2 ответа:
во-первых, это правильный метод? Есть ли способ, не касаясь ServletAPI?
можно использовать
ExternalContext#invalidateSession()
чтобы аннулировать сеанс без необходимости захвата API сервлета.@ManagedBean @SessionScoped public class UserManager { private User current; public String logout() { FacesContext.getCurrentInstance().getExternalContext().invalidateSession(); return "/home.xhtml?faces-redirect=true"; } // ... }
что произойдет с моим текущим сеансом боба с областью видимости? так как даже сам Боб хранится в HttpSession?
он по-прежнему будет доступен в текущем ответ, но его больше не будет в следующем запросе. Таким образом, важно, что перенаправление (новый запрос) запускается после invalidate, в противном случае вы все еще отображаете данные из старого сеанса. Перенаправление может быть сделано путем добавления
faces-redirect=true
к результату, как я сделал в приведенном выше примере. Другой способ отправки перенаправления-это использованиеExternalContext#redirect()
.public void logout() throws IOException { ExternalContext ec = FacesContext.getCurrentInstance().getExternalContext(); ec.invalidateSession(); ec.redirect(ec.getRequestContextPath() + "/home.xhtml"); }
его использование, однако, сомнительно в этом контексте, поскольку использование результата навигации проще.