问题:
在做登录模块时,使用Postman做接口测试,发现session不能共享问题:第一次请求将系统随机生成验证码放入Session中,第二次请求想要获取系统生成的验证码,但是取到的值为null,因此无法判断登录条件是否满足。
问题发现与解决:
验证码信息:
{
"status"
:
200
,
"msg"
:
"发送成功"
,
"data"
:
"810661"
}
登录接口,登录时发现验证码不正确, 两次获取的sessionid不一致,导致在登录时候,没有获取session中的验证码! ,第二次接口访问从session获取的验证码的值是null,因此返回验证码不正确:
最后也就是将这个问题归咎于 验证码的获取与验证,在AController里面获取生成验证码,放到session,如何在BController里面获取? 也就是我们常件的spring如何共享controller里面的session问题!
SessionSetController
@RestController public class SessionSetController { @GetMapping(value = "/set") public String setSessionAttribute(HttpSession session){ String uuid = UUID.randomUUID().toString(); session.setAttribute("uuid",uuid); return uuid; } }
SessionGetController
@RestController public class SessionGetController { @GetMapping(value = "/get") public Boolean getSessionAttribute(HttpSession session){ String uuid = (String) session.getAttribute("uuid"); if ("uuid".equals(uuid)){ return true; }else { return false; } } }
测试发现,从第二个session获取到的验证码是空的:
原因分析
后台的跨域导致session失效
结论:
正常情况下,不同controller之间的session是没有共享的,要实现session之间的共享,需要通过其他方法来实现,比如 Spring Session 分布式存储 Session 、使用 Redis+Token的方式 两种常见的方式。
来源:oschina
链接:https://my.oschina.net/jacklinnn/blog/3161873