在Logout上使JSF2中的Http会话无效

时间:2014-11-07 12:09:02

标签: session jsf-2

版本:

Apache MyFaces 2.1.14

Rich Faces 4.3.5

问题:

我想在用户点击Logout页面时使JSF会话无效。 我决定使用PreRenderViewEvent。 以下是相同的设计:

在呈现注销页面时,通过PreRenderViewEvent调用后端bean中的侦听器方法。 在java方法中使JSF会话无效,如:FacesContext.getCurrentInstance().getExternalContext().invalidateSession();

我的问题是:这是一种使会话无效的正确方法吗?或者有更好的方法吗?

代码:

<!-- call this in Logout.xhtml page -->
<f:event listener="#{bean.invalidateSession}" type="preRenderView" />

编辑1:

让我详细说明问题的背景。 我的系统中有两个Web应用程序。 当用户单击“注销”按钮时,它始终转到webApp1。 要求是使webApp1中的会话无效,然后重定向到webApp2,再次使会话无效。 在渲染webapp1 LogOut页面时将使用preRenderView事件。那里的监听器将使会话无效并重定向到webapp2 LogOut页面,如下面的代码:

public void logOut(ComponentSystemEvent event) throws IOException{

            //logoutAction param will be read from request 
            String redirectUrl = "/webapp2/Logout.xhtml?action="+logoutAction;
            FacesContext.getCurrentInstance().getExternalContext().invalidateSession();
            FacesContext.getCurrentInstance().getExternalContext().redirect(redirectUrl);

}

1 个答案:

答案 0 :(得分:0)

我通常只是在模板上添加一个按钮:

<h:commandLink action="#{loginBean.logout()}" value="Logout" rendered="#{!empty loginBean.account}" />

这个按钮调用我的“login”管理器bean,它包含一个属性Account account,填充了用户的参数。它也只在用户连接时才会呈现。

public String logout()
{
    setAccount(null);
    FacesContext.getCurrentInstance().getExternalContext().getSessionMap().clear();
    FacesContext.getCurrentInstance().getExternalContext().invalidateSession();

    NavigationUtils.redirect("/admin/login");
    return "";
}