Подтвердить что ты не робот

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

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

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

Ответ 1

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

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

Ответ 2

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