3

エンタープライズ Java システム (JSP、サーブレット、EJB) 用に、静的な方法 (静的メソッド) で使用できるユーティリティ クラスを開発したいと考えています。ユーザーのオブジェクトにアクセスできるいくつかのメソッドが含まれてHttpSessionおり、属性として既に保存されているいくつかの有用な情報 (現在のユーザー ID など) を取得します。

HttpSessionオブジェクトをどこにでも簡単に渡すことができるのに、なぜそのようなものが必要なのか疑問に思う人もいるかもしれません。HttpSession実際、私は従来の Java EE 5.0 システムで作業しており、一部のユーティリティ クラス (サーブレット、JSP、EJB 以外) はオブジェクトにアクセスできません。

そのようなユーティリティクラスを実装することは可能ですか? 私/あなたがここで考慮すべきいくつかの制約:

  • サーブレット/JSP は、EJB をホストするマシンとは異なるマシンでホストされます。
  • システムは Weblogic 10.3.0 で実行されています。
  • weblogic には、(サーブレット/JSP をホストする) 多くのサーバーがあり、それらは同じクラスターの下にあります。同じことが EJB サーバーにも当てはまります。
  • Collectionユーティリティ クラス内でstatic を宣言すると、機能しますか? それとも、複数のクラスローダーと複数の JVM のために、複数のコピーが存在するのでしょうか?
  • たぶん、共有ファイルまたは共有データベースを使用して実装する必要がありますか? ユーティリティ クラスを呼び出したユーザーを追跡するにはどうすればよいでしょうか。多分スレッドを追跡しますか?または多分トランザクションに関連する何か?
4

2 に答える 2

5

を利用しThreadLocalます。HttpSessionそこに直接保管しないでください。javax.servletサービス レイヤーは、 APIに依存するべきではありません。代わりに、必要な情報を から直接抽出し、HttpSessionそこに保存します。

Userたとえば、の属性をHttpSessionスレッド ローカル変数として公開する場合:

public class SomeContext {

    private static ThreadLocal<SomeContext> instance = new ThreadLocal<SomeContext>();
    private User user;

    private SomeContext(User user) {
        this.user = user;
    }

    public static SomeContext getCurrentInstance() {
        return instance.get();
    }

    public static SomeContext newInstance(User user) {
        SomeContext someContext = new SomeContext(user);
        instance.set(someContext);
        return someContext;
    }

    public void release() {
        instance.remove();
    }

    public User getUser() {
        return user;
    }

}

そしてこれはdoFilter()サーブレットフィルターの:

User user = (User) request.getSession().getAttribute("user");
SomeContext someContext = SomeContext.newInstance(user);

try {
    chain.doFilter(request, response);
} finally {
    // It's very important to do this in finally!
    // Threads are namely pooled by the container.
    someContext.release();
}

EJB を含む、特定のフィルターの後にまったく同じスレッドで実行されているコードでは、User次のように取得できます。

User user = SomeContext.getCurrentInstance().getUser();
// ...
于 2013-03-19T14:11:53.300 に答える
1

HttpSessionはスレッドに対してローカルです。

本当にHttpSessionが必要ですか、それとも静的なThreadLocal属性を使用して必要なことを実行できますか?

参照:http ://docs.oracle.com/javase/6/docs/api/java/lang/ThreadLocal.html

ところで、Apache Shiroはこのクラスを使用して、いくつかの「セッション」情報を格納します。

于 2013-03-19T13:58:47.383 に答える