Spring BootアプリケーションにおけるSpring Sessionの配置(3):Session RepositoryFilterConfigration
概要
本明細書では、以下の組み合わせのアプリケーションに基づいて、 前の2つの記事では、
ソースコード解析
関連記事 Spring BootアプリケーションにおけるSpring Sessionの構成(1):自動設定Session AutoConfigration Spring BootアプリケーションにおけるSpring Sessionの構成(2):Redisベースの構成Redis Session Configration
本明細書では、以下の組み合わせのアプリケーションに基づいて、
Spring Boot
アプリケーションにおけるSpring Session
の構成手順をソースコードによって分析する.Spring Boot 2.1.3.RELEASE
Spring Session Core 2.1.4.RELEASE
Spring Session Data Redis 2.1.3.RELEASE
Spring Web MVC 5.1.5.RELEASE
SessionAutoConfiguration
とRedisSessionConfiguration
を分析した.SessionAutoConfiguration
は、Spring Boot
に関する自動構成クラスであり、特定の条件とタイミングが満たされたときにSpring Session
を呼び出し、RedisSessionConfiguration
は、RedisSessionConfiguration
に基づくRedis
の最終作業コンポーネントを構成属性を用いて本当の構成にして最終的にSpring Session
を生成する.この文章はSessionRepositoryFilter bean
を見に来ました.SessionRepositoryFilterConfiguration
をSessionRepositoryFilter bean
容器に登録するのが任務です.Servlet
容器に登録されているのはSessionRepositoryFilter
だけで、ユーザは、処理中にServlet
の動作が最終的にHttpSession
メカニズムによってサービスされます.ソースコード解析
Spring Session
package org.springframework.boot.autoconfigure.session;
// import
@Configuration
// bean SessionRepositoryFilter
@ConditionalOnBean(SessionRepositoryFilter.class)
// server.session.* bean SessionProperties
@EnableConfigurationProperties(SessionProperties.class)
class SessionRepositoryFilterConfiguration {
// bean FilterRegistrationBean, bean,
// Servlet , bean SessionRepositoryFilter
@Bean
public FilterRegistrationBean<SessionRepositoryFilter<?>> sessionRepositoryFilterRegistration(
SessionProperties sessionProperties, SessionRepositoryFilter<?> filter) {
FilterRegistrationBean<SessionRepositoryFilter<?>> registration = new FilterRegistrationBean<>(
filter);
registration.setDispatcherTypes(getDispatcherTypes(sessionProperties));
registration.setOrder(sessionProperties.getServlet().getFilterOrder());
return registration;
}
// DispatcherType , ,
// : DispatcherType.ASYNC, DispatcherType.ERROR, DispatcherType.REQUEST
private EnumSet<DispatcherType> getDispatcherTypes(
SessionProperties sessionProperties) {
SessionProperties.Servlet servletProperties = sessionProperties.getServlet();
if (servletProperties.getFilterDispatcherTypes() == null) {
return null;
}
return servletProperties.getFilterDispatcherTypes().stream()
.map((type) -> DispatcherType.valueOf(type.name())).collect(Collectors
.collectingAndThen(Collectors.toSet(), EnumSet::copyOf));
}
}
締め括りをつけるServlet
の構成タスクは比較的簡単であり、HttpSession
、SessionRepositoryFilterConfiguration
が大量の検出と配置作業を行った後、SessionRepositoryFilterConfiguration
が一つのことをしたと考えられ、既に存在しているSessionAutoConfiguration
を一つのRedisSessionConfiguration
に包装し、SessionRepositoryFilterConfiguration
容器が起動した時、bean SessionRepositoryFilter
がFilterRegistrationBean bean
容器に登録される.Servlet
は、bean SessionRepositoryFilter
に基づくServlet
メカニズムだけではなく、SessionRepositoryFilterConfiguration
が実際に使用している格納庫が他のタイプである場合、例えばRedis
、Spring Session
、または関係データベースに基づいて、Spring Session
を使用する.関連記事