0

これが私の質問です。私は、プロジェクトを実装するために顧客に提供するプラットフォームを作成しています。したがって、私のプラットフォームでは、、 、 などのSessionServiceメソッドを持つ を作成しました。春のセッションの前は、次のように見えました。getCurrentSessiongetAttributesetAttributegetCurrentMethod

@Override public HttpSession getCurrentSession() { if (this.session == null) { final ServletRequestAttributes attr = (ServletRequestAttributes) RequestContextHolder.currentRequestAttributes(); return attr.getRequest().getSession(true); // true == allow create } return this.session; }

見栄えが悪く、redisのような裏付けがありませんが、これは完全に正常に機能しました。に移行したいのですspring-sessionが、を使用しSessionRepositoryてユーザーの現在のセッションを見つけたいと思っていましたgetSession(String id)が、そこにはしか表示されません。IDはCookieに保存されていると思うので、それを使用するには、おそらくHttpServletRequestコントローラーからファサード、dbレイヤーに非常に近いサービスレイヤーにオブジェクトを渡す必要があります。これは私には非常に悪い考えのように見えるので、私の質問は次のようになります: currentSession を db レイヤーの近くに取得する方法はありますか? 私が考える1つの方法は、コントローラーを呼び出すインターセプターを作成することです。これにより、現在のセッションがリポジトリーまたはサービスに設定されますか? これが正しい方法かどうかはわかりません。

4

1 に答える 1

1

サービス層からのセッション ID の取得

を使用しRequestContextHolderて、セッション ID を取得し、属性を設定し、属性を削除できます。

RequestContextHolder通常、RequestContextListenerまたはを使用してセットアップされますRequestContextFilter。Spring Sessionが呼び出されるRequestContextListener前にリクエストをラップする方法がないため、Spring Session は機能しません。RequestContextListener

残念ながら、Spring Boot アプリケーションの場合、これはRequestContextHolderそのままでは機能しません。これを回避するには、RequestContextFilterBean を作成します。この問題の更新については、spring-boot/gh-2637を参照してください。

これをセッションに入れる必要がありますか?

多くのオブジェクトを簡単にセッションに入れ、それを Redis に保存できるからといって、それが正しいことであるとは限りません。

リクエストごとにセッション全体が取得されることに注意してください。そのため、Redis は高速ですが、セッションに多数のオブジェクトがある場合、これは大きな影響を与える可能性があります。明らかに、実装は状況に合わせて最適化できますが、セッションの概念は一般的にこのプロパティを保持していると思います。

一般的な経験則は、「リクエストの 95% 以上でこのオブジェクトが必要か?」です。(これを私のリクエストのほとんどすべてとして読んでください)。もしそうなら、それはセッションの候補になるかもしれません。ほとんどの場合、オブジェクトがこの基準に適合する場合、オブジェクトはセキュリティ関連である必要があります。

サービス層で ThreadLocal からセッション ID にアクセスする必要がありますか?

コードは科学であると同時に芸術でもあるため、これは確かに議論の余地があります。

ただし、アーキテクチャ全体でスレッド ロケール変数からセッション ID を取得するべきではないと私は主張します。これを行うと、ThreadLocale の HttpServletRequest から「個人 ID」を取得し、現在の「個人 ID」を取得するのと少し似ています。代わりに、コントローラーから値を取得し、サービス層に渡す必要があります。

于 2015-03-31T13:01:57.350 に答える