版本:
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);
}
答案 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 "";
}