问题描述:
记录一个很小但又搞得我蛋疼的问题:我在登陆之后将token和用户数据存到session当中,可当我在后面的接口取值时,为null
解决过程:
接下来在调试的时候发现每次请求sessionid不一致,期初我还是以为是跨域造成的,于是按照以往的方式配置拦截器设置了这样一段
response.setHeader("Access-Control-Allow-Origin", request.getHeader("Origin"));//支持跨域请求
response.setHeader("Access-Control-Allow-Headers", "Authorization, Origin, X-Requested-With, Content-Type, Accept,Access-Token");
response.setHeader("Access-Control-Allow-Methods","PUT,POST,GET,DELETE,OPTIONS,PATCH");
response.setHeader("Access-Control-Allow-Credentials","true");//是否支持cookie跨域
在前端配置了
axios.defaults.withCredentials = true;// 允许跨域携带cookie
重新启动项目刷新访问,发现依然不行,接下来我又把Origin写死成前端服务地址,可是还是不行......网上各种百度,答案跟我以上几乎一样,内心慌张,汗流一地...但还是得继续排查呀
继续一边百度一边打开了昨天研究的一个小demo,也用到了session中的数据,可那demo是能取到值的,我对比了连着之间的配置,Cors相关的配置都是差不多的呀,前端结构也一样的,这就奇怪了。
继续仔细对比,发现demo没有配置api项目名,也就是
server:
servlet:
#api前缀(项目名)
context-path: /
#服务端口
port: 8080
而我这边是有配置项目名的,于是,我也把yaml和前端的项目名去掉了,结果还真就好了!!!
初步解决方案
可是配置在分模块开发nginx反向代理的场景下不配置项目名是不行的呀,可是又没有解决办法,情急之下想到了手动去修改Cookies的JSESSIONID的值,于是尝试在登陆之后将sessionid手动写入了Cookies的JSESSIONID,结果发现真的行得通!
可是仔细想想,这样做的话就把定sessionid的起始点写死了,如果要在登陆前请求其他需要用到session的接口,那不就GG了吗,如果有变动我们根本不确定要调的第一个接口是哪个,虽然我们开发时是知道的,但作为具有强迫症的开发者得我,是非常不容许“定死”“写死”这样的字眼出现在我的字典里的!!!
最终解决方案
知道是多了项目名的问题后,于是我又顺着“项目名导致session数据丢失”的思路去逛帖子,结果真发现了国外一老哥的一篇帖子!
模模糊糊看懂他表达的意思是将Vue代理中的的名字改为接口根路径(也就是后台配置的api项目名),抱着试一试的心态去改了
proxyTable: {
'/Api': {
target: 'http://192.168.1.133:8080/ttic/api/',
changeOrigin: true,
pathRewrite: {
'^/Api': '/'
}
}
},
改为以下
proxyTable: {
'/ttic': {
target: 'http://192.168.1.133:8080/ttic/api/',
changeOrigin: true,
pathRewrite: {
'^/ttic': '/'
}
}
},
重新编译后,重新进入看腻了的登录界面,啪!按下回车键,大功告成!!!进入首页了!!!至此终于解决了困扰了我一个多小时的问题!!!赶紧打开CSDN记录一下!