Ответ 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");
}
В этом контексте его использование сомнительно, так как использование результатов навигации проще.