一·背景
自己的个人项目准备做前后端分离了,也会考虑使用WebSocket,要考虑session一个读取,和存储的问题,当然这块自己写代码也可以解决,使用spring-session就可以使用现成较成熟的方案了。
二·方案选择
使用spring-session去实现也有多种方案去选择
1·session是存储:redis、jvm内存map、mongo、gemfire、hazelcast、jdbc,我这里选择存储到redis
2·session通过cookie 读取 还是通过header读取,我这里选择header
三·集成
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.9.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent>
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency>
<dependency> <groupId>org.springframework.session</groupId> <artifactId>spring-session-data-redis</artifactId> <version>1.3.1.RELEASE</version> </dependency>
<dependency> <groupId>biz.paluch.redis</groupId> <artifactId>lettuce</artifactId> <version>4.4.2.Final</version> </dependency>
如果是自己写,不使用spring-session的话可以考虑使用:
<dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt</artifactId> <version>0.9.0</version> </dependency>
四·使用
1·创建session配置类
import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory; import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession; import org.springframework.session.web.http.HeaderHttpSessionStrategy; import org.springframework.session.web.http.HttpSessionStrategy; /** * 说明: * * @author WangBin * @version v1.0 * @date 2018/1/27/027. */ @Configuration @EnableRedisHttpSession public class HttpSessionConfig { @Value("${spring.redis.host}") private String host; @Value("${spring.redis.port}") private int port; /** * RedisHttpSession 创建 连接工厂 * * @return */ @Bean public LettuceConnectionFactory connectionFactory() { return new LettuceConnectionFactory(host, port); } /** * 自定义 Token * * @return */ @Bean public HttpSessionStrategy httpSessionStrategy() { HeaderHttpSessionStrategy headerHttpSessionStrategy = new HeaderHttpSessionStrategy(); headerHttpSessionStrategy.setHeaderName("Token"); return headerHttpSessionStrategy; } }
@EnableRedisHttpSession
public @interface EnableRedisHttpSession { int maxInactiveIntervalInSeconds() default 1800; String redisNamespace() default ""; RedisFlushMode redisFlushMode() default RedisFlushMode.ON_SAVE; }
可以配置session的最大存活时间 和 在redis里存储session的空间名称还有
session更新策略,有ON_SAVE、IMMEDIATE,前者是在调用SessionRepository#save(org.springframework.session.Session)时,在response commit前刷新缓存,后者是只要有任何更新就会刷新缓存
然后需要创建一个 LettuceConnectionFactory
然后 HttpSessionStrategy 默认提供了两种实现:CookieHttpSessionStrategy和HeaderHttpSessionStrategy
因为我们考虑把 session存header读取 所以这里 使用了HeaderHttpSessionStrategy,并修改了默认的头名称x-auth-token 为Token
到此 整合完毕。