Spring BootアプリケーションにおけるSpring Sessionの配置(3):Session RepositoryFilterConfigration


概要
本明細書では、以下の組み合わせのアプリケーションに基づいて、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
  • 前の2つの記事では、SessionAutoConfigurationRedisSessionConfigurationを分析した.SessionAutoConfigurationは、Spring Bootに関する自動構成クラスであり、特定の条件とタイミングが満たされたときにSpring Sessionを呼び出し、RedisSessionConfigurationは、RedisSessionConfigurationに基づくRedisの最終作業コンポーネントを構成属性を用いて本当の構成にして最終的にSpring Sessionを生成する.この文章はSessionRepositoryFilter beanを見に来ました.SessionRepositoryFilterConfigurationSessionRepositoryFilter 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の構成タスクは比較的簡単であり、HttpSessionSessionRepositoryFilterConfigurationが大量の検出と配置作業を行った後、SessionRepositoryFilterConfigurationが一つのことをしたと考えられ、既に存在しているSessionAutoConfigurationを一つのRedisSessionConfigurationに包装し、SessionRepositoryFilterConfiguration容器が起動した時、bean SessionRepositoryFilterFilterRegistrationBean bean容器に登録される.Servletは、bean SessionRepositoryFilterに基づくServletメカニズムだけではなく、SessionRepositoryFilterConfigurationが実際に使用している格納庫が他のタイプである場合、例えばRedisSpring Session、または関係データベースに基づいて、Spring Sessionを使用する.
    関連記事
  • Spring BootアプリケーションにおけるSpring Sessionの構成(1):自動設定Session AutoConfigration
  • Spring BootアプリケーションにおけるSpring Sessionの構成(2):Redisベースの構成Redis Session Configration