springsession实现原理:将sessionid保存在客户端的cookie里面,然后将该sessionid作为key将session保存在redis服务端,可以就可以实现分布式及跨域(跨域指a.com站点跳转到b.com站点保持session,需要特殊处理一下)。开始我们的实验。
第一步:pom.xml引入相关jar
<!--Redis起步依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
<version>2.1.7.RELEASE</version>
</dependency>
<!--20210805 spring session测试 -->
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-core</artifactId>
<version>2.5.1</version>
</dependency>
<!--Spring session data redis-->
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-redis</artifactId>
<version>2.5.1</version>
</dependency>
第二步:配置application.properties中redis信息
spring.redis.cluster.nodes=172.17.18.133:6379,172.17.18.133:6380,172.17.18.134:6379,172.17.18.134:6380,172.17.18.135:6379,172.17.18.135:6380
spring.redis.pool.max-active=300
spring.redis.database=0
spring.redis.pool.max-wait=-1
spring.redis.pool.max-idle=100
spring.redis.pool.min-idle=20
spring.redis.timeout=60000
spring.redis.password=test1234
spring.session.store-type=redis
第三步:springsession配置
package com.figo.springboottest.config;
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;
import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;
@Configuration
@EnableRedisHttpSession(maxInactiveIntervalInSeconds=1800)
public class SpringSessionConfig {
/**
* 更换序列化器
* @return
*/
@Bean("springSessionDefaultRedisSerializer")
public RedisSerializer setSerializer(){
return new GenericJackson2JsonRedisSerializer();
}
}
第四步:编写controller测试
package com.figo.springboottest.controller;
import javax.servlet.http.HttpSession;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("session")
public class SpringSessionController {
@RequestMapping("getTestKey")
public String getMsg(HttpSession session) {
String msg=(String) session.getAttribute("TestKey");
return msg+"|sessionId="+session.getId();
}
@RequestMapping("setTestKey")
public String setMsg(HttpSession session) {
session.setAttribute("TestKey", "Hello World!");
return "ok|sessionId="+session.getId();
}
}
第五步:测试springsession
设置
http://10.17.195.37:8090/springboot/session/setTestKey
获取
http://10.17.195.37:8090/springboot/session/getTestKey
通过redis-cli登录redis查看redis中的值
./redis-cli -a test1234 -c -h 172.17.18.133 -p 6379
172.17.18.133:6379> keys *
可以看到"spring:session:sessions:eb2beafe-3256-4629-a61a-8cf83d4f0aad"
172.17.18.133:6379> type spring:session:sessions:eb2beafe-3256-4629-a61a-8cf83d4f0aad
hash
172.17.18.133:6379> hkeys spring:session:sessions:eb2beafe-3256-4629-a61a-8cf83d4f0aad
1) "lastAccessedTime"
2) "maxInactiveInterval"
3) "creationTime"
4) "sessionAttr:msg"
5) "sessionAttr:TestKey"
172.17.18.133:6379> hget spring:session:sessions:eb2beafe-3256-4629-a61a-8cf83d4f0aad sessionAttr:TestKey
"\"Hello World!\""
补充:关于跨域a.com跳转到b.com继续保持session
具体方法如下:
1. 定义CustomerCookiesSerializer
public class DefaultCookieSerializer implements CookieSerializer {
// 此处拷贝DefaultCookieSerializer中的代码
// 修改getCookiePath方法体
private String getCookiePath(HttpServletRequest request) {
if (this.cookiePath == null) {
// 此处改为返回根路径
return "/";
}
return this.cookiePath;
}
}
2. 注入CustomerCookiesSerializer
通过Spring的注解方式注入CustomerCookieSerializer到CookieHttpSessionStrategy中
@Configuration
@EnableRedisHttpSession
public class HttpSessionConfig {
@Bean
public CookieHttpSessionStrategy cookieHttpSessionStrategy() {
CookieHttpSessionStrategy strategy = new CookieHttpSessionStrategy();
strategy.setCookieSerializer(newCustomerCookieSerializer());
return strategy;
}
}
参考:https://blog.csdn.net/alaska_bibi/article/details/53126456
本文详细介绍了Spring Session的实现机制,通过将sessionID存储在客户端cookie并利用Redis作为会话存储,实现了分布式及跨域session管理。步骤包括引入相关依赖、配置Redis信息、设置Spring Session配置、编写Controller进行测试,并展示了通过Redis CLI查看存储的session数据。此外,还补充了如何处理a.com到b.com的跨域session保持问题。

1009

被折叠的 条评论
为什么被折叠?



