Spring Session と Redis を使用して分散セッションのクロスドメイン共有の問題を解決する
現象の説明:
正面プロジェクト内の -end コードとバックエンド コードは異なります。分離後、サービスが 2 つのインスタンスで正常に実行されていると、再ログインが必要であることを示すプロンプトが時折ポップアップ表示され、バックグラウンド エラー メッセージ
はプロセッサ例外です。理由は明らかではありません。
マシン インスタンスを追加した後、フロントエンド ページにアクセスすると、ログイン ページが繰り返しアクセスされるため、さまざまな兆候は、ログイン構成の問題が原因であることを示しています。
関連トピックの推奨事項: php セッション (画像、テキスト、ビデオ、ケースを含む)
問題導入 : セッションを共有できないため、ログインが必要な異なるマシン間でポーリングが発生し、最終的なサービス例外が発生します
解決策: Spring Session と Redis を使用して分散セッションの問題を解決しますクロスドメイン共有
設定の解決策:
1 )依存関係の追加
<dependency> <groupId>org.springframework.session</groupId> <artifactId>spring-session-data-redis</artifactId> <version>1.2.0.RELEASE</version> </dependency> <dependency> <groupId>org.apache.velocity</groupId> <artifactId>velocity</artifactId> <version>1.7</version> </dependency>
2 )Web の追加.xml 設定ファイル:
<!-- 分布式Session共享Filter --> <filter> <filter-name>springSessionRepositoryFilter</filter-name> <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> </filter> <filter-mapping> <filter-name>springSessionRepositoryFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
3) Spring.xml 設定
<!-- 将session放入redis --> <context:annotation-config/> <bean id="redisHttpSessionConfiguration" class="org.springframework.session.data.redis.config.annotation.web.http.RedisHttpSessionConfiguration"> <property name="maxInactiveIntervalInSeconds" value="120" /> </bean> <bean class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory"> <!-- redis 配置 --> <property name="hostName" value="192.168.0.48" /> <property name="port" value="6379" /> </bean>
分析:
1. Web の DelegatingFilterProxy クラス: プロキシ フィルターに属します。 Tomcat の開始後に読み込みが開始されます。web.xml でフィルタリングする場合、フィルタの管理は Spring の Bean に引き継がれます。つまり、設定の 3 番目のステップで RedisHttpSessionConfiguration
2 が導入されます。RedisHttpSessionConfiguration は継承します。 SpringHttpSessionConfiguration クラス。このクラスは非常に重要です。SpringHttpSessionConfiguration は @Bean Inject springSessionRepositoryFilter をコンテナに渡します
##3,SessionRepositoryFilterこのフィルタは、DelegatingFilterProxy によって検索されるフィルタです。SessionRepositoryFilter がキーです。どのような関係がありますか?
springSessionRepositoryFilterこのフィルター
SessionRepositoryFilter の機能は、コンテナのデフォルトの javax.servlet.http.HttpSession サポートを
org.springframework.session.Session に置き換えることです。
SessionRepositoryResponseWrapper、
SessionRepositoryRequestWrapper## があります。 #, HttpSessionWrapper
は内部クラスであり、これも非常に重要です。たとえば、SessionRepositoryRequestWrapper クラス
SessionRepositoryRequestWrapper が javax.servlet.http.HttpServletRequestWrapper クラスを継承していることがわかります。HttpServletRequest インターフェイスのデフォルトの実装は次のとおりであることがわかります。 HttpServletRequestWrapper、次のように
6. SessionRepositoryRequestWrapper は HttpServletRequestWrapper を継承し、HttpServletRequestWrapper は HttpServletRequest インターフェイスを実装するため、SessionRepositoryRequestWrapper では、HttpServletRequest インターフェイスのいくつかのメソッドを書き換えるため、次のものが存在します。 、changeSessionId などのメソッド。この時点で、元のリクエストとレスポンスが再パッケージ化されたことを大まかに理解する必要があります。また、元の HttpSeesion が Spring Session にどのように置き換えられたかも理解できます。
ショートカット キーを使用して request.getSession() の特定の実装を表示すると、SessionRepositoryRequestWrapper によってオーバーライドされたメソッドがすでに存在していることがわかります。上記のデフォルトの実装は 2 つあり、1 つはオリジナルで、もう 1 つは Spring Session によって実装されています。どちらを実装として選択する必要がありますか? これは、上で説明した DelegatingFilterProxy プロキシの役割です。DelegatingFilterProxy を通じて各リクエストをフィルタリングします。各リクエストは、 springSessionRepositoryFilter フィルターも通過します。 springSessionRepositoryFilter フィルターは、元のリクエストから SessionRepositoryRequestWrapper への変換を実現します。これが特定のプロセスです。
request.getSession().setAttribute(name, value)
実装: コードを追跡すると、以下のコンテンツに到達できます。
そこにあることがわかります。 Redis 関連の操作です!この時点で、Spring Session がどのように機能するかを理解する必要があります。以下のプロセスは改めて紹介しませんが、すでに明確に理解されています。
関連する学習に関する推奨事項: redis ビデオ チュートリアル
以上がSpring Session と Redis を学び、分散セッションのクロスドメイン共有の問題を解決するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。