2

Java EEアプリケーションにフィルターを追加しようとしていますが、いくつかの問題が発生しています。

ログインの目的でフィルターを使用したいので、ログインを管理するUserManagerBeanと「通信」させる必要があります。

これが私の構造です:

  • LoginFilter:ServletFilter
  • LoginBean:SessionScopedマネージドBean
  • UserManager:ステートフルセッションBean

UserManagerには、ログインプロセスを処理するメソッドがあるため、 LoginFilterLoginBeanの両方からアクセスする必要があります。

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);
   }
   ...
}

ここで問題が発生します。

LoginFilterLoginBeanは、UserManagerの2つの異なるインスタンスを使用します。LoginBeanはUserManagerの別のインスタンスで機能し、 LoginFilterはログインが完了したことを認識しないため、これにより、ログインしているユーザーでもフィルターが停止します。

どうすれば修正できますか?ルックアップとインジェクションはSSFBの同じインスタンスを返すと思いました!

4

1 に答える 1

1

いいえ、新しいインスタンスを返します。フィルターでルックアップを複数回行っても、異なるインスタンスが返されます。

LoginBean に UserManagerLocal を注入する代わりに、フィルターで作成した UserManagerLocal インスタンスを維持/使用する必要があります。要求から同じインスタンスを取得します。

于 2012-10-04T13:39:41.220 に答える