使用session.invalidate的JSF注销不会清除当前的用户名?

时间:2011-02-04 15:07:38

标签: jsf httpsession

在我的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()而不仅仅是检查用户名?

谢谢! 罗布

2 个答案:

答案 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时返回的值。