如何清除会话作用域管理的Bean对象?

11

我正在使用JSF和primefaces开发一个基于登录的应用程序。在这个应用程序中,我将已登录用户的信息保存在session scoped managedbean中,当他注销时,我需要清除该信息。那么,如何清除SessionScoped ManagedBean对象中的这些详细信息呢?

3个回答

20
您需要在操作方法中调用以下函数来使当前会话失效:
FacesContext.getCurrentInstance().getExternalContext().invalidateSession();

此外,由于会话范围的bean在后续请求中被清除,因此请务必发送重定向:

FacesContext.getCurrentInstance().getExternalContext().redirect("/login.xhtml");

或者,从您的方法中简单返回导航案例结果:

return "login.xhtml?faces-redirect=true";

如果您不想使会话失效并保留会话范围的Bean(在我看来这是一种不好的做法),只需在注销方法中将所有用户数据(希望这些数据都收集在一个会话范围的托管Bean中)清空即可。如果注销方法位于另一个会话范围的Bean中,则可能需要注入该Bean。


3
您不需要手动清除会话范围的托管Bean。只需清除用户会话即可。 在Servlet中使用以下代码进行注销: ```java request.getSession().invalidate(); ```
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);

其中,“managed_bean_name”是您托管bean的名称。

希望能对您有所帮助。


-3

当用户注销时,会话将被销毁,所有的SessionScoped ManagedBean对象也将被销毁


2
“注销”并不一定意味着“会话已销毁”。然而,通常情况下是相反的。 - BalusC
我不同意。注销通常意味着“会话失效”。这是最佳实践,也是常见的模式。不销毁会话会导致安全问题。 - Nicolas Labrot
1
嗯,当然。如果那是情况的话,提问者就不会首先提出这个问题 :) - BalusC
此外,“通常”是您陈述中的奇怪单词。销毁会话始终会销毁bean(包括用户管理器),但在“注销”时,您可以销毁bean,使会话无效,执行其他作业等-因为这是一项自定义操作。您输入的内容决定了含义-这就是结果。然而,这确实是最佳实践。 - skuntsel
@BalusC 是的,我太过于考虑自己的经验,而忽略了提问者的需求 :) - Nicolas Labrot

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接