- Spring Session
- Session储存到Redis
- 1:添加依赖
- 2:配置信息
- 3:Spring Session存String
- 3:Spring Session存对象
- 项目改造-Redis储存Session
Spring Session
Spring Session储存在Redis和取的执行流程:
1:request.getSession() 方法时,Servlet 容器会创建一个 HttpSession 对象,并返回给你。然后,Spring Session 进行拦截和包装,使用动态代理生成一个代理对象,该代理对象实现了 HttpSession 接口。
2:调用 httpSession.setAttribute() 方法设置属性值时,代理对象会拦截这个操作;将数据存储到 Redis 中以进行持久化保存。
3:调用 httpSession.getAttribute() 方法获取属性值时,代理对象会拦截这个操作;从 Redis 中检索数据,并返回给你。
Session session = request.getSession(); // 创建或获取会话;你配置储存在Redis;就会通过代理对象外部储存和取。通过动态代理的方式;当需要集成这个功能时;代码都不需要修改;你只需要添加配置即可
//有点区别:session.getAttribute在Spring Session返回的是你存的具体对象类型。而HttpSession的session.getAttribute返回的是Object类型
Spring Session相比于HttpSession有什么优势?
1:分布式会话管理;Spring Session 允许将会话数据存储在外部存储系统中,例如 Redis。
2:灵活的会话超时配置; Spring Session 允许灵活地配置会话的超时时间,而不仅仅依赖于容器或应用服务器的默认配置。
Session储存到Redis
1:添加依赖
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-redis</artifactId>
<!--有Session有Redis;已经包含 Redis 客户端框架-->
</dependency>
2:配置信息
#配置Session存在redis;而不是内存
spring.session.store-type=redis
#on_save 表示在保存(或更新)会话时,才会将会话的改变写入到Redis。
spring.session.redis.flush-mode=on_save
#会话的超时时间设置为1800秒,30分钟。
server.servlet.session.timeout=1800
#数据库名中命名层级
spring.session.redis.namespace=spring:session
3:Spring Session存String
@RestController
class UserCOntroller{
private static final String Session_key="User_key";
@RequestMapping("/loginset")
public String loginset(HttpServletRequest request){
HttpSession httpSession=request.getSession();
httpSession.setAttribute(Session_key,"zhangsan");
String s=(String) httpSession.getAttribute(Session_key);
return s;
}
@RequestMapping("/loginget")
public String loginget(HttpServletRequest request){
HttpSession httpSession=request.getSession(false);
String s=(String) httpSession.getAttribute(Session_key);
return s;
}
}
验证获取时是否成Redis获取:
3:Spring Session存对象
如果直接存的话是会报错的:
Redis 存储的数据都是以二进制数组形存在的。当我们在使用 RedisTemplate 这些Redis 客户端操作 Redis ,需要将数据序列化成二进制数组。
为什么Redis要是储存字节的形式:
1:数据持久化;防止丢失;需要将数据序列化为字节流,以便将其写入持久化文件,然后在重新加载时将其反序列化为对象。
2:网络传输;我们远程连接Redis是要通过网络连接;那么网络传输;字节流就是一个好的方式。
3:多语言支持;字节流就能适用于不同的编程语言的各种类型和对象
4:储存优化;字节流的储存更紧凑;能节省更多内存。内存相对硬盘比较贵。
Java 中的基本数据类型,它们都有默认的序列化方式可以通过实现 Serializable 接口来自定义序列化方式。而自定义类型;你得你对象拥有序列化和反序列能力。在对象上实现Serializable接口。
如果不想序列化;加transient把它排除掉;就没法存进去的;序列化把这个忽略了。