Как сделать сеанс недействительным в JSF 2.0?

Каков наилучший способ аннулировать сеанс в приложении JSF 2.0? Я знаю, что сам JSF не обрабатывает сессию. Пока я мог найти

private void reset() {
    HttpSession session = (HttpSession) FacesContext.getCurrentInstance()
            .getExternalContext().getSession(false);
    session.invalidate();
}
  1. Этот метод правильный? Есть ли способ, не касаясь ServletAPI?
  2. Рассмотрим сценарий, в котором @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";  
}
Другие вопросы по тегам