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