問題
在 SpringCloud 框架的項目中,添加驗證碼校驗,驗證碼存放在 session 中。后端在校驗過程中,發現從 session 中獲取驗證碼為 null。
分析
debug 的時候發現,每一次請求,后端獲取到的 session 的 id 都不一樣。
校驗驗證碼的那個模塊有兩個實例,請求 A 實例時,生成了一個 id 為 sessionId1 的 session,請求 B 實例時,B 發現 sessionId1 沒有對應的 session,於是重新生成了一個 sessionId2 的 session。當再次請求實例 A 時,A 發現 sessionId2 的 session 不存在,於是又生成一個新的 session...
解決
對於同一個瀏覽器會話,需要讓不同服務共享同一個 session,可以借助 redis 來實現。
- pom 文件
<!--spring boot 與redis應用基本環境配置 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!--spring session 與redis應用基本環境配置 -->
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-redis</artifactId>
</dependency>
- 配置好 redis
spring.redis.database = 0
spring.redis.host = 172.16.131.153
spring.redis.port = 6379
spring.redis.password = test
spring.redis.pool.max-active = 200
spring.redis.pool.max-wait = -1
spring.redis.pool.max-idle = 10
spring.redis.pool.min-idle = 0
spring.redis.pool.timeout = 1000
- 在需要共享 session 的服務的啟動類上,加上注解
@EnableRedisHttpSession