如何使JSF 2.0中的会话无效?

在JSF 2.0应用程序中使会话无效的最佳方式是什么? 我知道JSF本身不处理会话。 到目前为止,我可以find

private void reset() { HttpSession session = (HttpSession) FacesContext.getCurrentInstance() .getExternalContext().getSession(false); session.invalidate(); } 
  1. 这个方法是否正确? 有没有触摸ServletAPI的方法?
  2. 考虑一个@SessionScoped UserBean处理用户login注销的场景。 我在同一个bean中有这个方法。 现在当我完成必要的数据库更新之后调用reset()方法时,我的当前会话scoped bean会发生什么? 因为即使这个bean本身存储在HttpSession

首先,这个方法是否正确? 有没有触摸ServletAPI的方法?

您可以使用ExternalContext#invalidateSession()来使会话无效,而无需获取Servlet API。

 @ManagedBean @SessionScoped public class UserManager { private User current; public String logout() { FacesContext.getCurrentInstance().getExternalContext().invalidateSession(); return "/home.xhtml?faces-redirect=true"; } // ... } 

我的当前会话scoped bean会发生什么? 因为即使这个bean本身存储在HttpSession中?

在当前的响应中仍然可以访问,但是在下一个请求中不会再出现。 因此,redirect(一个新的请求)在无效之后触发是非常重要的,否则你仍然在显示旧会话中的数据。 redirect可以通过在结果中添加faces-redirect=true来完成,就像我在上面的例子中那样。 发送redirect的另一种方法是使用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(); } 
Interesting Posts