原則は説明の原則とコアの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のは、関連する操作を見ることができます!
この時点で、我々は明確にする必要があり、春のセッションの原則!プロセスが導入を下回らなかったが、それは明確に理解されています。
概要
研究のその他の詳細についてはあまり春セッションの全体の実行プロセスについての上ではなく、後の学習は、物品を補完していきます!