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

4 篇文章 0 订阅
3 篇文章 0 订阅

本文主要解决跨服务跳转的时候关于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";
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值