最近开发项目时,须要用到后端设置session,用户请求时,更具session设置给前端的cookie获取session的值,因为项目采用的是前端后端分离(先后端不在一个域上),故出现了如题所示问题:html
代码前端
// 获取验证码 getCaptcha() { const { ctx } = this; const captcha = svgCaptcha.createMathExpr({ inverse: false, // 翻转颜色 fontSize: 50, // 字体大小 noise: 1, // 噪声线条数 width: 110, // 宽度 height: 38, // 高度 color: true, // 验证码的字符是否有颜色,默认没有,若是设定了背景,则默认有 }); ctx.session.maxAge = 1000 * 60; // 1分钟 ctx.session.renew = false; // 设置在连续访问的时候不刷新剩余时间 ctx.session.verifyCode = captcha.text; // 设置session this.success({ code: captcha.data, }); } // login async login() { const { ctx } = this; const { account, password, code } = ctx.request.body; const verifyCode = ctx.session.verifyCode; console.log(verifyCode); if (code !== verifyCode) { this.error('验证码错误', 444); return; } ... }
一切访问正常,可是vue
通过查阅,缘由是cookie跨域,不能访问的缘由,须要对代码进行相关设置:ios
参考: https://blog.csdn.net/weixin\_45932463/article/details/110350608
前端(vue axios):chrome
// 进行一些全局配置 axios.defaults.baseURL = 'http://127.0.0.1:7001'; //egg后台的地址 axios.defaults.timeout = 5000; axios.defaults.withCredentials = true; // 让axios发送请求的时候带上cookie
设置后,访问以下:(这种状况下,还须要后端设置)axios
后端(用的是阿里的eggjs)后端
<span>注意:下面有origin的多种设置方式,特别是多个跨域,值得收藏哦</span>跨域
config.cors = { // origin: '*', // origin: 'http://127.0.0.1:9384', origin(ctx) { // return "*"; // 容许来自全部域名请求 // return ctx.header.origin;// 当*没法使用时,使用这句,一样容许全部跨域 // return 'http://localhost:8080'; //单个跨域请求 // 容许多个跨域 const allowCors = [ 'http://localhost:9384', 'http://127.0.0.1:9384', 'http://172.16.92.62:9384', ]; return allowCors.indexOf(ctx.header.origin) > -1 ? ctx.header.origin : ''; }, credentials: true, // 前台能够携带cookies 无此选项的话,仍是上面的跨域 allowMethods: 'GET,HEAD,PUT,POST,DELETE,PATCH,OPTIONS', };
设置后浏览器
能够正常获取到后台设置的cookie了(session会自动向前端设置一个cookei)cookie
至此基本登录能够正常进行了
若是你用的是google浏览器,或者内核是chrome的浏览器,若是版本高于80
后台获取session,仍是undefined
上图能够看到,这种cookie没有成功
从Chrome 51
开始,浏览器的Cookie
新增长了一个 SameSite属性,用来防止CSRF
攻击和用户追踪。
该设置当前默认是关闭的,但在Chrome 80
以后,该功能默认已开启
解决方法:
用户:
Chrome
设置,将chrome://flags/#same-site-by-default-cookies
禁用,而后重启浏览器。开发者:
SameSite
属性值改成None
, 同时 将secure
属性设置为true
。且须要将后端服务域名必须使用https
协议访问。SameSite = None
,有SCRF
风险,因此,最佳方案是用token
代替Cookie
方式做验证。本例中的解决方案推荐使用Redis解决