一,传统session管理
http请求本来是无状态的请求,为了使服务器知道每次会话的信息,浏览器使用cookie来携带seesion id,服务器通过session id来获取该次会话的信息。一般传统的session保存在tomcat的Servlet Container中的HttpSession中。由于session在两个不同的tomcat服务器中不共享,导致其他服务器想要获取用户信息时,用户得在其他系统进行多次的登录操作。
二,spring session
Spring-Session的实现就是设计一个过滤器Filter,当Web服务器接收到http请求后,当请求进入对应的Filter进行过滤,利用HttpServletRequestWrapper,实现自己的 getSession()方法,接管创建和管理Session数据的工作。将原本需要由web服务器创建会话的过程转交给Spring-Session进行创建,本来创建的会话保存在Web服务器内存中,通过Spring-Session创建的会话信息可以保存第三方的服务中,如:redis,mysql等。Web服务器之间通过连接第三方服务来共享数据,实现Session共享!
spring session比较完美的解决了上述传统session管理的问题,spring session不依赖于tomcat容器,其使用第三方存储服务来保存session(redis,mysql等)使得session可以得到统一管理。
三,代码实现
请确保已经配置好了redis
- 导入依赖
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-redis</artifactId>
</dependency>
- 相关配置
# spring-session
spring.session.store-type=redis #数据库类型
spring.session.timeout=1440m #session过期时间
- 编写配置类
@EnableRedisHttpSession
@Configuration
public class SessionConfiguration {
/**
* 配置cookie信息
* */
@Bean
public CookieSerializer cookieSerializer(){
DefaultCookieSerializer defaultCookieSerializer = new DefaultCookieSerializer();
defaultCookieSerializer.setCookieName("SPUERMALLSESSION");
return defaultCookieSerializer;
}
/**
* session序列化器, 决定spring-session以哪种方式来序列化session中的数据
* */
@Bean
public RedisSerializer<Object> springSessionDefaultRedisSerializer() {
return new GenericJackson2JsonRedisSerializer();
}
}