http是无协议的,每次访问都是一次新的请求,服务器不知道是哪个用户的请求,为了解决这个问题,引入session,session是保存在服务器中的类似于map类型的资源。
当用户访问服务后,会生成一个字符串,并返回给服务器,每次请求服务器都会带上这个字符串,这就相当于是客户端通往服务器的卡,有了这个卡,服务器才能让客户端访问指定资源。
但是在分布式环境中,会导致session不一致,我们用springsesion解决这一问题,简单说就是将session缓存到redis中。
1、引入依赖
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-redis</artifactId>
</dependency>
2、配置redis的连接信息
spring.redis.host=192.168.1.10
spring.redis.port=6379
3、将session数据保存到redis中
spring.session.store-type=redis
spring.session.redis.flush-mode=on_save
spring.session.redis.namespace=spring:session
4、在启动类中添加注解
@EnableRedisHttpSession
5、编写配置类,配置cookie和redis的序列化
@Configuration
public class SessionConfig {
@Bean
public CookieSerializer cookieSerializer(){
DefaultCookieSerializer cookieSerializer = new DefaultCookieSerializer();
//如果是子域名的session配置到父域名中,实现session共享
cookieSerializer.setDomainName("abc.com");
cookieSerializer.setCookieName("MySESSION");
return cookieSerializer;
}
/**
* redis的序列化
* @return
*/
@Bean
public RedisSerializer<Object> springSessionDefaultRedisSerializer() {
return new GenericJackson2JsonRedisSerializer();
}
}
6、将数据保存到session域中
session.getAttribute("user");