本文主要解决跨服务跳转的时候关于session的问题
发现问题、debug加断点查问题、针对性给出解决方案、尝试、成功,最后记录
首先,最关键的一点,session是和服务端同在的,再通俗一点,每个服务在机器上都是有一个端口的,也可以说session和端口同在。
本来我的问题就是多个服务端之间redirect的时候,数据无法相互传递,但是由于毕设项目我是个人开发,直接全栈了。
所以第一反应是前端出问题了,Ajax或者LauUI的问题,于是乎我就快速地改造一个普通的html,然后提交form表单,发现仍存在前端页面重合的问题。
这时候就已经排除前端的问题了,着眼于后端的拦截器、控制器代码逻辑、session。
最后经历两个断点(分别在session传递前和传递被接受后)
发现确实传递没被接收到。
接下来开始设计怎么让它被接收到?
我的思路是用代码量最少的redis来解决的,考虑到redis作为缓存存储,读写速度算是稳定且较快的。
代码如下:
1,登录模块:
dormitoryAdmin = dormitoryAdminService.selectBySite(username);
if(dormitoryAdmin!=null && Md5Util.encode(password).equals(dormitoryAdmin.getPassword())){
while (redisTemplate.boundValueOps("dormitoryAdmin").get()!=null){
//有人在登录着,循环等待,先卡着, 这里的 redis 就相当于是 临界资源
}
redisTemplate.opsForValue().set("dormitoryAdmin",dormitoryAdmin);
//TODO 跳转到总管理的主界面 端口:1003
return "redirect:http://localhost:1003/refresh";
}
2,对应的服务模块:
@RequestMapping("/refresh")
@CrossOrigin
public String refresh(HttpServletRequest request) {
//先从redis中拿出来缓存的登录记录
DormitoryAdmin dormitoryAdmin = (DormitoryAdmin) redisTemplate.boundValueOps("dormitoryAdmin").get();
//立即放入本服务中的session中
request.getSession().setAttribute("dormitoryAdmin",dormitoryAdmin);
//清除redis中自己的登录记录缓存
redisTemplate.delete("dormitoryAdmin");
return "admin";
}
最后,这个开发过程,把学的操作系统进程章节的算法用到了毕业设计的开发中,很爽,所以记录一下。
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net