在我的JSF应用程序中,我得到了当前登录用户的名字......
public String getLoggedInUsername() {
return FacesContext.getCurrentInstance().getExternalContext().getRemoteUser();
}
...我检查用户是否已登录...
public boolean isSignedIn() {
return (getLoggedInUsername() != null);
}
......当用户退出时,我这样做......
public String doLogout() {
FacesContext facesContext = FacesContext.getCurrentInstance();
HttpSession httpSession = (HttpSession)facesContext.getExternalContext().getSession(false);
httpSession.invalidate();
return "main";
}
我的问题是在doLogout()之后,getLoggedInUsername()仍然返回登录用户的名称。我应该做些什么来确保getRemoteUser()在注销后返回null?
或者,是否有更好的方法来获取isSignedIn()而不仅仅是检查用户名?
谢谢! 罗布
答案 0 :(得分:16)
确保在使会话无效后重定向请求。基于会话属性解析用户主体。因此,当您转发到目标页面时(默认情况下作为JSF导航案例),它仍然会在目标页面中,因为它使用相同的 HttpSession
引用。重定向指示webbrowser触发全新的HTTP请求,从而强制服务器根据新请求重新创建HttpSession
引用。
将<redirect/>
添加到导航案例以强制JSF发送重定向。或者当您已经使用JSF 2.0时,将?faces-redirect=true
添加到结果值。
答案 1 :(得分:0)
通话后#34; session.invalidate();&#34; ,添加&#34; request.logout();&#34;。
方法对会话对象无效只是清理会话数据。
请求对象上的方法注销将null作为在请求时调用getUserPrincipal,getRemoteUser和getAuthType时返回的值。