Как сделать сеанс недействительным в JSF 2.0? - PullRequest
58 голосов
/ 11 апреля 2011

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

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

Ответы [ 2 ]

124 голосов
/ 11 апреля 2011

Во-первых, правильный ли этот метод?Есть ли способ, не касаясь 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";
    }

    // ...

}

что будет с моим текущим сессионным компонентом?поскольку даже сам bean-компонент хранится в HttpSession?

Он все еще будет доступен в текущем ответе, но его больше не будет в следующем запросе.Таким образом, важно, чтобы перенаправление (новый запрос) запускалось после аннулирования, в противном случае вы по-прежнему отображаете данные из старого сеанса.Перенаправление можно сделать, добавив faces-redirect=true к результату, как я делал в приведенном выше примере.Другой способ отправки перенаправления - использование ExternalContext#redirect().

public void logout() throws IOException {
    ExternalContext ec = FacesContext.getCurrentInstance().getExternalContext();
    ec.invalidateSession();
    ec.redirect(ec.getRequestContextPath() + "/home.xhtml");
}

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

13 голосов
/ 19 июля 2012
public void logout() {
    FacesContext.getCurrentInstance().getExternalContext().invalidateSession();
}
...