10

在我的 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?

或者,是否有比仅检查用户名更好的方法来获取 if isSignedIn() ?

谢谢!抢

4

2 回答 2

17

确保您在使会话无效后重定向请求。用户主体是基于会话属性解析的。因此,当您只是转发到目标页面时(默认情况下,JSF 导航案例会这样做),那么它仍然会存在于目标页面中,因为它使用相同 HttpSession的引用。重定向指示网络浏览器触发一个全新的 HTTP 请求,从而强制服务器HttpSession根据新请求重新创建引用。

添加<redirect/>到导航案例以强制 JSF 发送重定向。或者当您已经在 J​​SF 2.0 中时,添加?faces-redirect=true结果值。

于 2011-02-04T15:16:50.563 回答
0

调用“session.invalidate();”后 ,添加“request.logout();”。

会话对象上的方法无效只是清理会话数据。

Method logout on request object establish null as the value returned when getUserPrincipal, getRemoteUser, and getAuthType is called on the request.

于 2014-10-17T09:16:58.687 回答