Как аннулировать сеанс в JSF 2.0?


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

private void reset() {
    HttpSession session = (HttpSession) FacesContext.getCurrentInstance()
            .getExternalContext().getSession(false);
    session.invalidate();
}
  1. является ли этот метод правильным? Есть ли способ, не касаясь Сервлетапи?
  2. рассмотрим сценарий, в котором a @SessionScoped UserBean обрабатывает login-выход пользователя из системы. У меня есть этот метод в том же Бобе. Сейчас когда я звоню reset() метод после того, как я закончу с необходимой БД обновления, что будет на моей текущей сессии областью фасоли? с даже сам Боб хранится в HttpSession?
2 57

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");
}

его использование, однако, сомнительно в этом контексте, поскольку использование результата навигации проще.

public void logout() {
    FacesContext.getCurrentInstance().getExternalContext().invalidateSession();
}