0

我正在尝试在 SessionScoped 托管 bean 中缓存身份验证信息。

当我第一次打开浏览器并登录服务器(浏览器要求我输入用户名/密码)时,它可以正常工作。

当我重新启动 webapp 或服务器(这是一个开发设置)时,问题就来了。然后,从我之前登录的浏览器之一访问 webapp,导致在我的@PostConstruct方法中FacesContext.getCurrentInstance().getExternalContext().getUserPrincipal()返回 null(我检查它是否有效执行)。

另一方面,如果我只是从 中检查该值getUser(),则它可以正常工作。

AFAIK,我希望浏览器只是缓存凭据,并且当我在重新启动后重新进入应用程序时,唯一的区别是浏览器会自动发送凭据而不会再次提示我。我没想到它会对服务器产生任何影响。

代码如下(简化)

@ManagedBean
@SessionScoped
public class UserManager {

private Principal userPrincipal = null;

@PostConstruct
public void init() {
  this.userPrincipal = 
    FacesContext.getCurrentInstance().getExternalContext().getUserPrincipal();
  System.out.println("EN POSTCONSTRUCT DE LDAP PRINCIPAL!! " + this.userPrincipal);
}

public String getUser() {
  return this.userPrincipal.getName();
}

}

设置是带有 Mojarra 2.03、JDK 6 的 JBoss 6.1 Final。我已经用 IE7 和 Firefox 对其进行了测试。

更新:我发现了更多关于它的信息。如果我进入欢迎页面,那么 webapp 会按预期工作。当我尝试直接访问另一个页面 (*1) 时,它无法初始化用户信息。

*1:我不是在谈论重新加载页面,因为这总是失败,而是http://myserver/mywebapp/page_that_is_not_welcome_one.xhtml在 URL 栏中输入。

4

0 回答 0