概述
本文基于以下组合的应用,通过源代码分析一下一个Spring Boot应用中Spring Session的配置过程:
Spring Boot 2.1.3.RELEASESpring Session Core 2.1.4.RELEASESpring Session Data Redis 2.1.3.RELEASESpring 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机制服务(替换了Servlet容器原生的HttpSession机制)。
源代码分析
SessionRepositoryFilterConfiguration
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));
}
}
总结
SessionRepositoryFilterConfiguration的配置任务相对简单,在SessionAutoConfiguration,RedisSessionConfiguration做了大量的检测和配置工作之后,可以认为SessionRepositoryFilterConfiguration就做了一件事情,将已经存在的bean SessionRepositoryFilter包装成一个FilterRegistrationBean bean,这样Servlet容器启动时,bean SessionRepositoryFilter会被注册到Servlet容器。
SessionRepositoryFilterConfiguration并不仅仅针对基于Redis的Spring Session机制,如果Spring Session实际使用的存储库是其他类型,比如MongoDB,Hazelcast或者基于关系型数据库,也会使用SessionRepositoryFilterConfiguration。

本文深入剖析SpringBoot中SpringSession的配置流程,重点讲解SessionRepositoryFilterConfiguration如何将SessionRepositoryFilter注册到Servlet容器,实现替换原生HttpSession机制。
2448

被折叠的 条评论
为什么被折叠?



