文章字数:240,阅读全文大约需要1分钟
session和cookie
http是无状态协议,为了能够维持状态,采用了session
和cookie
的机制。session
保存在服务器端,用户访问时会带上sessionId
以判断是那个session的信息。
springSession
springSession
使用第三方存储实现集群session
管理(redis,mongodb,jdbc),使用AOP
技术,几乎可以做到透明替换原生session
。
- 方便拓展
Cookie
和自定义session
相关的Listener
Filter
- 方便和
spring Security
集成
sprinBoot集成使用Redis的SpringSession
依赖
1 2 3 4 5 6 7 8
| <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.session</groupId> <artifactId>spring-session-data-redis</artifactId> </dependency>
|
1 2 3 4
| @Configuration @EnableRedisHttpSession public class HttpSessionConfig { }
|
配置连接
1 2 3 4 5
| spring: redis: host: localhost port: 6379 database: 0
|
关键源码
springSessionRepositoryFilter
拦截HttpSession
的拦截器
AbstractSecurityWebApplicationInitializer
和AbstractHttpSessionApplicationInitializer
初始化器,拥有很高优先级
根据用户名查找用户所属的session
1 2 3 4 5 6 7 8 9 10 11
|
request.getSession().setAttribute(FindByIndexNameSessionRepository.PRINCIPAL_NAME_INDEX_NAME,username);
@Autowired FindByIndexNameSessionRepository<? extends ExpiringSession> sessionRepository; public Map findByUserName(String userName){ Map<String, ? extends ExpiringSession> usersSession = sessionRepository.findByIndexNameAndIndexValue(FindByIndexNameSessionRepository.PRINCIPAL_NAME_INDEX_NAME,username); }
|