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