java · 2024年5月13日 0

分布式服务中的session管理

一,传统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();
    }
}