原理が説明原理とコアのRedisの実用化(6)スプリングセッションは、分散セッションの問題を解決します

原則は説明の原則とコアのRedisの実用化(7)春のセッションは、分散セッションの問題を解決

あなたは春のセッションの原則の実現を学ぶの下に前の春のセッションとセッションのRedisは、クロスドメインの分散シェアの問題を解決するために使用する方法について説明し、我々は、単純なケースを導入しました。

web.xmlファイルの話を開始します

私たちは、再起動Tomcatが最初にロードするために行くときことを知っているweb.xmlファイルをする場合、Tomcatが起動するweb.xml順序がロードされますcontext-param -> listener -> filter -> servlet

私たちは春のセッションを使用する場合、我々はフィルタを構成し、次のように、コンフィギュレーション・コードは次のとおりです。

<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>
     <dispatcher>REQUEST</dispatcher>
     <dispatcher>ERROR</dispatcher>
</filter-mapping>
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

ここで説明する絵を書きます

教えてくださいDelegatingFilterProxy。このクラス:

DelegatingFilterProxyクラスspringSessionRepositoryFilter名が設定豆Springコンテナとフィルタコンバータをルックアップするために、を求めDelegatingFilterProxy、このフィルタはspringSessionRepositoryFilterと呼ばれる、各要求。

指定しない場合init-paramのパラメータを、そしてDelegatingFilterProxyそれは置くfilter-nameあなたが探しているBeanオブジェクトを、これはDelegatingFilterProxy役割のようなもの。各要求はフィルタを通して見られる、フィルタが通過対応して要求されますspringSessionRepositoryFilterし、我々はそれから見ることができ、このフィルタspringSessionRepositoryFilterのフィルタ。

springSessionRepositoryFilterフィルタを作成します

SpringコンテナからspringSessionRepositoryFilterを見つけるためのプロセス上のDelegatingFilterProxyは、我々はどの場所どこでspringSessionRepositoryFilterを注入していますか?答えはここにあります:

<bean class="org.springframework.session.data.redis.config.annotation.web.http.RedisHttpSessionConfiguration"/>
 
  • 1

ここで説明する絵を書きます

Spring構成ファイル内の我々は、手動で、RedisHttpSessionConfigurationを注入し、我々は、セッションを保存するために、デフォルトのRedisを使うからです。

RedisHttpSessionConfigurationこのクラスは、注入プロファイルとして、コンフィギュレーションノートを追加します。

RedisHttpSessionConfigurationの役割は、フィルターから継承された春のBeanの名前のspringSessionRepositoryFilterを作成することです。springSessionRepositoryFilterデフォルトのHttpSession詰め替え容器は春のセッション、Redisの中に保存されたセッションのインスタンスをサポートしています。

(1)RedisHttpSessionConfiguration継承を次のように

@Configuration
@EnableScheduling
public class RedisHttpSessionConfiguration extends SpringHttpSessionConfiguration
		implements EmbeddedValueResolverAware, ImportAware {
}
 
  • 1
  • 2
  • 3
  • 4
  • 5

ここで説明する絵を書きます

(2)RedisHttpSessionConfigurationメインメソッドとプロパティを次のように

ここで説明する絵を書きます

(3)@Bean方法によってRedisHttpSessionConfiguration RedisMessageListenerContainer、RedisTemplate、RedisOperationsSessionRepository等はSpringコンテナに注入されます。

(4)RedisHttpSessionConfiguration SpringHttpSessionConfigurationこのクラスを継承し、このクラスは、方法springSessionRepositoryFilterによってSpringHttpSessionConfiguration @Bean容器に注ぎ、非常に重要です。

ここで説明する絵を書きます

springSessionRepositoryFilterこのフィルタは、フロントDelegatingFilterProxyでフィルタを見ています!

(6)私たちは、彼が役割SessionRepositoryFilterのSessionRepositoryFilterタイプはデフォルトのコンテナjavax.servlet.http.HttpSessionサポートorg.springframework.session.Sessionを交換することであることがわかります。

SessionRepositoryFilter的主要方法和属性如下:

ここで説明する絵を書きます

(7)其中SessionRepositoryResponseWrapper、SessionRepositoryRequestWrapper、HttpSessionWrapper为内部类,这个也是很关键的。例如SessionRepositoryRequestWrapper类:

ここで説明する絵を書きます

可以看出SessionRepositoryRequestWrapper继承了javax.servlet.http.HttpServletRequestWrapper这个类,我们知道HttpServletRequest接口的默认实现是有HttpServletRequestWrapper的,如下:

ここで説明する絵を書きます

(8)因为SessionRepositoryRequestWrapper继承了HttpServletRequestWrapper,而HttpServletRequestWrapper实现了HttpServletRequest接口,在SessionRepositoryRequestWrapper又重写了HttpServletRequest接口中的一些方法,所以才会有:getSession、changeSessionId等这些方法。

到此,我们应该大致明白了,原有的request请求和response都被重新进行了包装。我们也就明白了原有的HttpSeesion是如何被Spring Session替换掉的。

需要注意的是:

The SessionRepositoryFilter must be placed before any Filter that access the HttpSession or that might commit the response to ensure the session is overridden and persisted properly.
 
  • 1

案例分析

(1)Controller代码如下:

ここで説明する絵を書きます

(2)查看效果:

ここで説明する絵を書きます

我们通过快捷键查看request.getSession() 的具体实现,就可以看出已经有了SessionRepositoryRequestWrapper 重写的方法。

そこ上記の2つのデフォルトの実装で、1元、1が春のセッションが実現の種類の特定の選択として実装され、これは我々が上に述べたものですDelegatingFilterProxyプロキシの役割、彼はDelegatingFilterProxyを通じて、各フィルタを要求します各要求は、特定のプロセスを達成することであるSessionRepositoryRequestWrapperに元の要求の変換を達成するためにspringSessionRepositoryFilterフィルタ、springSessionRepositoryFilterフィルタが適用されます!

(3)でrequest.getSession()のsetAttribute(名前、値)的实现。:

トラッキングコードは、次のコンテンツに到達することができます

ここで説明する絵を書きます

セッション中this.session.setAttribute(名前、値)セッションインタフェース特定の実装で定義されています。

ここで説明する絵を書きます

Redisのは、関連する操作を見ることができます!

この時点で、我々は明確にする必要があり、春のセッションの原則!プロセスが導入を下回らなかったが、それは明確に理解されています。

概要

研究のその他の詳細についてはあまり春セッションの全体の実行プロセスについての上ではなく、後の学習は、物品を補完していきます!

おすすめ

転載: www.cnblogs.com/ko88/p/11697979.html