Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jsf 2 如何清除会话范围的托管bean的对象?_Jsf 2_Primefaces - Fatal编程技术网

Jsf 2 如何清除会话范围的托管bean的对象?

Jsf 2 如何清除会话范围的托管bean的对象?,jsf-2,primefaces,Jsf 2,Primefaces,我正在用JSF和primefaces开发一个基于登录的应用程序。因为我将记录的用户信息保存在会话范围的managedbean中,并且我需要在他注销时清除这些详细信息,所以如何在用户注销时清除SessionScoped managedbean对象中的这些详细信息,会话被销毁,所有会话范围的ManagedBean对象也被销毁您不需要手动清除会话范围的ManagedBean。只需清除用户会话。 通过在servlet中使用以下代码进行注销 protected void processRequest(Ht

我正在用JSF和primefaces开发一个基于登录的应用程序。因为我将记录的用户信息保存在会话范围的managedbean中,并且我需要在他注销时清除这些详细信息,所以如何在用户注销时清除SessionScoped managedbean对象中的这些详细信息,会话被销毁,所有会话范围的ManagedBean对象也被销毁

您不需要手动清除会话范围的ManagedBean。只需清除用户会话。 通过在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\u bean\u name”是托管bean的名称


希望它有帮助

您需要在操作方法中调用以下函数使当前会话无效:

FacesContext.getCurrentInstance().getExternalContext().invalidateSession();
此外,由于会话范围的bean在后续请求中被丢弃,请确保发送重定向:

FacesContext.getCurrentInstance().getExternalContext().redirect("/login.xhtml");
或者,只需从您的方法返回导航案例结果:

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

如果您不想使会话无效,并有效地保留会话范围的bean(在我看来这是一个糟糕的做法),只需在注销方法中取消所有用户数据(希望是在一个会话范围的托管bean中收集的)(如果注销方法驻留在另一个会话范围的bean中,您可能需要注入该bean)。

根据定义,“注销”不是“会话已销毁”。然而,通常情况下,反过来才是。我不同意。注销通常意味着“会话无效”。这是最佳做法,也是常见的模式。不破坏会话会产生安全问题,是的。如果是这样,OP一开始就不会问这个问题:)而且,通常是你声明中的一个单字。销毁会话总是会销毁bean(包括用户管理器),但在注销时,您可能会销毁bean、使会话无效、执行其他一些工作,等等,因为这是一个自定义操作。你所做的就是输入意义——这就是结果。然而,这确实是一个最好的实践。