我正在尝试在 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 栏中输入。