springSession解决微服务session共享问题
硅谷探秘者
2021-10-12发表
框架
0
0
1556
一、创建项目
创建两个项目projectA,projectB
二、pom文件相同
<parent>
<artifactId>springSession</artifactId>
<groupId>org.example</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis-reactive</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
三、配置文件相同,除端口外
server:
port: 8801
servlet:
context-path: /
spring:
redis:
host: 192.168.183.131
port: 6379
password: 123456
database: 0
四、Controller控制器相同
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpSession;
@RestController
public class TestPAController {
@GetMapping("set")
public String set(HttpSession session,String value){
session.setAttribute("name",value);
return "ok";
}
@GetMapping("get")
public String set(HttpSession session){
String value = (String)session.getAttribute("name");
return value;
}
}
此时在一个项目中调用set方法,在另一个项目调用get方法就能实现session共享,例如:
http://localhost:8801/set?value=zhejiushi
http://localhost:8802/get
五、配置context-path
在配置文件中配置context-path会使session共享失效例如:
server:
port: 8801
servlet:
context-path: /pa
访问:
http://localhost:8801/pa/set?value=zhejiushi
http://localhost:8802/pb/get
此时则无法实现session共享
原因:cookie所在目录不同
![]()
项目A所在目录是pa,项目b所在目录是pb。
解决方法:将两个项目的cookie的所在目录设置成根目录(/)就可以了
六、配置
在两个项目中都添加如下配置类:
@Bean
public CookieSerializer cookieSerializer() {
DefaultCookieSerializer serializer = new DefaultCookieSerializer();
serializer.setCookieName("SESSION");
serializer.setCookiePath("/");
serializer.setDomainNamePattern("^.+?\\.(\\w+\\.[a-z]+)$");
return serializer;
}
重启项目就解决了。