Java EEアプリケーションにフィルターを追加しようとしていますが、いくつかの問題が発生しています。
ログインの目的でフィルターを使用したいので、ログインを管理するUserManagerBeanと「通信」させる必要があります。
これが私の構造です:
- LoginFilter:ServletFilter
- LoginBean:SessionScopedマネージドBean
- UserManager:ステートフルセッションBean
UserManagerには、ログインプロセスを処理するメソッドがあるため、 LoginFilterとLoginBeanの両方からアクセスする必要があります。
LoginBeanにいる間、次の単純な行でUserManagerを取得します。
@EJB private UserManagerLocal userManager;
LoginFilterでそれを行うことができないため、ルックアップメソッドを作成する必要がありました。
try{
Context c = new InitialContext();
return (UserManagerLocal) c.lookup("java:global/PROJECT/PROJECT-ejb/UserManager!ejb.UserManagerLocal");
} catch (NamingException ex) {
...
}
このUserManagerLocalをリクエスト属性に追加する行もありましたが、lookupメソッドを呼び出すときにリクエストがないため、NPEがスローされるため、doFilter()メソッドに移動しました。
public void doFilter(...){
HttpServletRequest req = (HttpServletRequest) request;
if(req.getAttribute("userManager") == null){
req.setAttribute("userManager", userManager);
}
...
}
ここで問題が発生します。
LoginFilterとLoginBeanは、UserManagerの2つの異なるインスタンスを使用します。LoginBeanはUserManagerの別のインスタンスで機能し、 LoginFilterはログインが完了したことを認識しないため、これにより、ログインしているユーザーでもフィルターが停止します。
どうすれば修正できますか?ルックアップとインジェクションはSSFBの同じインスタンスを返すと思いました!