web-dev-qa-db-ja.com

HTTPセッションを使用するためのベストプラクティス(Java)

私の質問は、HTTPセッションの使用方法やセッションでの値の使用方法についてではありません。質問はアプローチについてより指向的です。

私の現在のアプリケーションでは、セッションに格納されている値がほとんどなく、これらの値が必要になることがあり、セッションから取得する値は次のとおりです

  1. お店
  2. 言語
  3. お客様
  4. 他のいくつか

私はこれらの値をセッションからフェッチできます

_request.getSession().getAttribute( "name" )
_

私のコントローラーではなく、他のレイヤー(たとえばFacade)にこれらの値が必要なので、2つのオプションがあります

  1. 必要な各値をrequest.getSession().getAttribute( "name" )によってFacadeメソッドに渡します。
  2. それぞれのFacadeクラスにメソッドを作成します。

ファサードの方法

_ private Object getSessionValue(final String key) {
    ServletRequestAttributes reqAttr = (ServletRequestAttributes) RequestContextHolder
                            .currentRequestAttributes();
            return reqAttr.getRequest().getAttribute(key);
}
_

私の場合はどちらも機能していますが、1つの例外を除いて、このメソッドを各Facadeクラスに配置するか、Controllerで各オブジェクトをフェッチする必要があります。

よりクリーンかもしれない他の方法やアプローチはありますか、または私の現在のアプローチは問題ありませんか

5
Umesh Awasthi

私の個人的なアプローチは、どこでもセッションを使用するnotです。コントローラー層での使用量を削減しようと思います。コントローラーで、ビジネスロジックに必要なものを抽出します。後者では、Webセッションが関与していることは決してわかりません。これにより、そのロジックは非Webアプリケーションに移植可能になり、定型コードのないタイプセーフな方法ですべてのデータを処理します。

リクエストを取得する定型コード、セッション、そしてセッションからのアイテムを回避したい場合は、メソッドアプローチで十分であり、私の経験では一般的な方法です。 Javaで使用している場合は、いくつかのジェネリックを追加することで少し改善できます。

 public static <T> T getSessionValue(final String key) {
    ServletRequestAttributes reqAttr = (ServletRequestAttributes) RequestContextHolder
                        .currentRequestAttributes();
        return (T) reqAttr.getRequest().getAttribute(key);
}

次のように使用できます。

Integer someSessionInt = SessionUtils.<Integer>getSessionValue("someSessionIntKey");

メソッドが静的SessionUtilsクラスで定義されていると想定しています。これを基本コントローラクラスで定義し、これをコントローラの内部から使用する場合は、次のように呼び出す必要があります。

Integer someSessionInt = this.<Integer>getSessionValue("someSessionIntKey");

thisキーワードはsuperで置き換えることができますが、これがないと、ジェネリックスが原因でコンパイルエラーが発生します。


上記の提案に加えて、セッションの使用を隠す別の方法があり、セッションフリーで独立したAPI /ファサードがあります。 programming-to-interfacesパラダイムに固執することで、セッションを使用するインターフェース実装を持つことができますが、ファサード/ APIで実施するインターフェースでは決して表示されません。したがって、たとえば、ゲストがゲストであるかどうか、特定の権限があるかどうかなど、現在ログインしているユーザーが誰であるかを示す、汎用承認サービス、公開されたトラフインターフェースがある場合があります。アプリケーションは、ユーザーをセッションから取得するサービスインターフェイスの具体的な実装を使用できます。サービスを使用する場合、インターフェースはセッションに関連するものを公開しないため、すべての使用はセッションにとらわれず、タイプセーフです。

4
Ivaylo Slavov