SessionScoped マネージド Bean で認証情報をキャッシュしようとしています。
初めてブラウザを開いてサーバーにログインすると(ブラウザはユーザー名/パスワードを要求します)、正常に動作します。
webappまたはサーバーを再起動すると問題が発生します(これは開発セットアップです)。次に、以前にログインしたブラウザーの 1 つから webapp にアクセスすると、@PostConstruct
メソッドでFacesContext.getCurrentInstance().getExternalContext().getUserPrincipal()
null が返されます (効果的に実行されていることを確認します)。
一方、 からその値を確認するだけではgetUser()
、正しく機能します。
私の知る限り、ブラウザーは資格情報をキャッシュするだけであり、再起動後にアプリケーションに再入力すると、ブラウザーが再度プロンプトを表示せずに資格情報を自動的に送信することが唯一の違いであると予想していました。サーバーに違いが生じるとは思っていませんでした。
コードは次のとおりです(簡略化)
@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 の両方でテストしました。
更新: 私はそれについてもっと見つけました。ウェルカム ページに移動すると、Web アプリケーションは期待どおりに動作します。ユーザー情報の初期化に失敗するのは、別のページ (*1) に直接アクセスしようとしたときです。
*1:これは常に失敗するため、ページの再読み込みhttp://myserver/mywebapp/page_that_is_not_welcome_one.xhtml
ではなく、URL バーに入力します。