0%

springSession

文章字数:240,阅读全文大约需要1分钟

session和cookie

http是无状态协议,为了能够维持状态,采用了sessioncookie的机制。session保存在服务器端,用户访问时会带上sessionId以判断是那个session的信息。

springSession

  1. springSession使用第三方存储实现集群session管理(redis,mongodb,jdbc),使用AOP技术,几乎可以做到透明替换原生session
  2. 方便拓展Cookie和自定义session相关的Listener Filter
  3. 方便和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

关键源码

  1. springSessionRepositoryFilter拦截HttpSession的拦截器
  2. AbstractSecurityWebApplicationInitializerAbstractHttpSessionApplicationInitializer初始化器,拥有很高优先级

根据用户名查找用户所属的session

1
2
3
4
5
6
7
8
9
10
11

//索引name (springSecurity似乎集成了这一步,直接索引了用户名)
request.getSession().setAttribute(FindByIndexNameSessionRepository.PRINCIPAL_NAME_INDEX_NAME,username);

//根据索引名和索引值查找sessionId(结果是个map,索引名固定索引值就是用户名)
@Autowired
FindByIndexNameSessionRepository<? extends ExpiringSession>
sessionRepository;
public Map findByUserName(String userName){
Map<String, ? extends ExpiringSession> usersSession = sessionRepository.findByIndexNameAndIndexValue(FindByIndexNameSessionRepository.PRINCIPAL_NAME_INDEX_NAME,username);
}