练手小项目----跨服务数据传输问题----解决方案

本文主要解决跨服务跳转的时候关于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";
}

你可能感兴趣的:(写着玩,学习,笔记,java)