Redis分布式Session
- 在首次获取session后,将sessionid作为键将对应session域信息序列化后保存到redis数据库内
- 需要获取session域信息时,拿着request携带的cookie中的sessionId值向redis数据库查找对应的数据,并反序列化为Session对象
/**
* 保存session
*
* @param req 请求信心
* @return 结果
*/
@GetMapping("/saveSession")
public AjaxResult saveSession(HttpServletRequest req){
System.out.println(new Date()+":::"+req.getSession().getId());
HttpSession session = req.getSession();
session.setAttribute("num",num++);
String sessionString = JSON.toJSONString(session);
redisFullUtil.set(session.getId(),sessionString);
return AjaxResult.success(session.getId()+"::"+session.getAttribute("num"));
}
/**
* 获取保存的session
*
* @param req 请求信息
* @return 结果
*/
@GetMapping("/getSession")
public AjaxResult getSession(HttpServletRequest req){
System.out.println(new Date()+":::"+req.getSession().getId());
String sessionString = redisFullUtil.get(req.getSession().getId());
HttpSession session = JSON.parseObject(sessionString, HttpSession.class);
return AjaxResult.success(session.getAttribute("num"));
}
程序运行后直接报错
com.alibaba.fastjson.JSONException: illegal setter
原因是redis序列化依赖于set和get方法,session中有些数据属性是没有的,
spring-session-data-redis
转变思路一番搜索,现有技术是如何实现session分离,发现spring-session-data-redis就是专门做这件事的,还帮我们完成了大部分的工作,只需要做一些简答的配置工作即可完成session的分离
1. pom引入依赖
<!-- spring boot 与 redis 应用的基本配置 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!-- spring session 与redis 应用环境基本配置, 需要开启redis后才可以使用, 不然启动会报错 -->
<dependency>
<groupId>org.springframework.session</groupId>
<