介绍
采用外置的Redis来存储session,以此来解决session共享的问题 大概思想就是弄个拦截器,拦截setAttribute和getAttribute的方法,将其存储到redis
pom文件
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>io.lettuce</groupId>
<artifactId>lettuce-core</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-redis</artifactId>
<version>2.6.2</version>
</dependency>
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-bom</artifactId>
<version>Bean-SR10</version>
</dependency>
yaml
spring:
redis:
host: 192.168.111.101
port: 6379
password:
database: 0
更改序列化器
默认采用jdk序列化器,效率低下
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializer;
@Configuration
public class RedisSessionConfig {
@Bean("springSessionDefaultRedisSerializer")
public RedisSerializer redisSerializer() {
return defaultRedisSerializer();
}
private RedisSerializer defaultRedisSerializer() {
return new GenericJackson2JsonRedisSerializer();
}
}
启动类加注解@EnableRedisHttpSession
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;
@SpringBootApplication
@EnableRedisHttpSession
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
同步对象
实现Serializable接口即可
public class User implements Serializable{}
@EnableRedisHttpSession
public @interface EnableRedisHttpSession {
int maxInactiveIntervalInSeconds() default 1800;
String redisNamespace() default "spring:session";
@Deprecated
RedisFlushMode redisFlushMode() default RedisFlushMode.ON_SAVE;
FlushMode flushMode() default FlushMode.ON_SAVE;
String cleanupCron() default "0 * * * * *";
SaveMode saveMode() default SaveMode.ON_SET_ATTRIBUTE;
}
失效时间
修改maxInactiveIntervalInSeconds,默认1800s–>30分钟
redisNamespace
redisNamespace默认spring:session , 不同命名空间的session无法访问,起到隔离的作用
使用
调用HttpSession session的方法即可
setAttribute、getAttribute
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpSession;
@RestController
public class TestController {
@Autowired
private HttpSession session;
@RequestMapping("/setMsg")
public String setMsg(String msg) {
session.setAttribute("msg", msg);
return "ok";
}
@RequestMapping("/getMsg")
public String getMsg() {
String msg = (String) session.getAttribute("msg");
return msg;
}
}
请求,msg=i love you

Redis中存在

获取msg

|