前端跨域时,会涉及到cookie的跨域问题,当你发现跨域已经正常,但是set-cookie就是不起作用时,你可以从以下2个方向来解决
1.cookie的域与当前命名不匹配
如cookie的域名为huyu.info
Set-Cookie: xxx=6666; path=/; expires=Mon, 22 Mar 2021 14:33:39 GMT; domain=huyu.info
但你的访问域名为http://127.0.0.1:8000,这时出现跨域,set-cookie就不起作用
你可以采用:
1.将domain去除,此时cookie的域将是你的访问地址的域
2.使用nginx代理
location /api {
proxy_pass https://b.test.com;
proxy_cookie_domain b.test.com a.test.com;
}
proxy_cookie_domain参数的作用是转换response的set-cookie header中的domain选项,由后端设置的域名domain转换成你的域名replacement,来保证cookie的顺利传递并写入到当前页面中,注意proxy_cookie_domain负责的只是处理response set-cookie头中的domain属性
如果你使用服务器跨域,你可以这样做(关于如何设置服务端跨域,你可以查看之前的文章):
安装
cnpm install http-proxy-middleware --save
此包中,有cookieDomainRewrite配置,可以方便实现上面替换cookie的操作
ctx.body = createProxyMiddleware({
target: 'https://www.yun.cn', // 服务器地址
changeOrigin: true,
secure: false,
"pathRewrite": {
"^/auth": ""
},
cookieDomainRewrite: {
'.yun.cn': '127.0.0.1'
}
})
2.前后端配置
服务器代理解决跨域时,你需要配置
服务的响应头需要配置Access-Control-Allow-Credentials并且为true。
响应头中的Access-Control-Allow-Origin一定不能为*,必须是指定的域名
前端配置浏览器发起ajax需要指定withCredentials 为true
以koa和axios为例子:
const Koa = require('koa');
const {createProxyMiddleware} = require('http-proxy-middleware');
const app = new Koa();
const cors = require('koa2-cors');
//跨域代理
app.use(cors({
origin: 'http://127.0.0.1:8080',
maxAge: 2592000,
credentials: true
}));
前端axios
import axios from 'axios'
// create an axios instance
const service = axios.create({
baseURL: process.env.VUE_APP_BASE_API,
timeout: 5000,
withCredentials: true
})
另外要注意的一件事,在配置和访问注意localhost和127.0.0.1不是一个东西!这坑了我几个小时
评论列表
已有0条评论