【发布时间】:2013-02-06 14:58:30
【问题描述】:
我正在使用 primefaces 在 JSF 中开发一个基于登录的应用程序。我将记录的用户信息保存在会话范围的 managedbean 中,当他注销时我需要清除这些详细信息,那么如何清除 SessionScoped ManagedBean 对象中的那些详细信息?
【问题讨论】:
标签: jsf-2 primefaces
我正在使用 primefaces 在 JSF 中开发一个基于登录的应用程序。我将记录的用户信息保存在会话范围的 managedbean 中,当他注销时我需要清除这些详细信息,那么如何清除 SessionScoped ManagedBean 对象中的那些详细信息?
【问题讨论】:
标签: jsf-2 primefaces
当用户注销时,会话被销毁,所有 SessionScoped ManagedBean 对象也被销毁
【讨论】:
您不需要手动清除会话范围的托管 bean。只需清除用户会话。 通过在 servlet 中使用以下代码进行注销。
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
System_Properties system_Properties=new System_Properties();
PrintWriter out = response.getWriter();
try {
request.getSession().invalidate();
}finally {
out.close();
}
}
如果您仍然手动清除托管 bean 数据,则可以使用以下代码完成。
FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("managed_bean_name", null);
“mananged_bean_name”是托管 bean 的名称。
希望对你有帮助
【讨论】:
您需要通过在您的操作方法中调用以下函数来使当前会话无效:
FacesContext.getCurrentInstance().getExternalContext().invalidateSession();
此外,由于会话范围的 bean 在后续请求中被丢弃,请务必发送重定向:
FacesContext.getCurrentInstance().getExternalContext().redirect("/login.xhtml");
或者,只需从您的方法返回导航案例结果:
return "login.xhtml?faces-redirect=true";
如果您不想使会话无效并有效地保留会话范围的 bean(在我看来这是一种不好的做法),只需取消所有用户数据(希望在一个范围内的会话中收集托管 bean)在注销方法中(如果注销方法驻留在另一个会话范围的 bean 中,您可能需要注入该 bean)。
【讨论】: