最新一个前后端分离的项目,出现了一个奇怪的现象,前端页面手动强刷新,便自动挑到了登录页。
看后端,是因为SessionID变了。
一般通过API接口实现前后端分离的项目这种Session丢失,可能是前端请求没有正确设置,正确设置参考如下:
1、$.ajax解决方案:
xhrFields: {
withCredentials: true
}
$.ajax({
url:api+'user/islogin',
xhrFields: {
withCredentials: true
},
data:postdata,
type:'json',
method:'post',
success:function(e){
}
})
2、axios解决方案
axios.defaults.withCredentials = true;
然而,前端配置后,依然还是没能解决问题;刷新页面后,依然会有Session丢失的现象。这个就比较困惑了,一度以为是前端同事没有正确修改,差点吵架。 但是,前端请求的Cookie中SessionID是没有变化的,所以问题可能还是后端的!
突然,灵机一动,看到前端刷新请求都会有同一个请求URL返回给前端信息,Session超时。进一步检查,但是发现这个URL在后端是不存在的!
仔细分析日志会发现:
No mapping for POST /visitor/user/getUserInfo
检查代码,确实没有这个URL! 但是为何不像通常那样,返回前端 404 Not Found 呢 ?
很可能在是这种 404 Not Found,不存在的URL,被后端的拦截器拦截了,系统认为是一个新的Session,因此会返回Session超时。
果然,如果将拦截器的代码注释,前端页面刷新,不存在的URL,返回的是 404 Not Found,这是通常的报错信息。
总结下来,问题和刷新不刷新没有关系。访问后端不存在的URL,如果是有拦截器,被拦截器拦截后会产生新的SessionID,获取不到原Session,从而Session信息丢失,被认为是登录超时。
但是,访问的地址后端不存在,为何拦截器会产生了新的SessionID呢 ? 这个恐怕是和拦截器机制有关系了,究竟为何,且听下回分解。如果知道原因的小伙伴,欢迎留言贴出来分享!