共计 1692 个字符,预计需要花费 5 分钟才能阅读完成。
一、为什么会有跨越问题
是客户端浏览器同源策略导致的,就是浏览器不允许不同源的站点相互访问。试想一下要是没有这个,那站点里的安全信息如 cookie,账号 / 密码等是不是很容易被其它站点获取。
二、解决思路
知道是客户端浏览器为了安全使用同源策略导致的,而服务端是没有这个限制的,那我们就只能通过服务端进行跨域了。不管是 jsop,core,还是代理的方式,都是需要服务配合的。哈哈,这也是为啥后端和生产环境下比较少听说跨域的问题,所以这里介绍开发环境中的几种方法。
三、解决方案
1. 完全交予后端解决,配值请求头信息(core),前端什么都不用做, 如 express.js 中配置如下,其它后端语言同理
app.all('*', function(req, res, next) {res.header("Access-Control-Allow-Origin", "*");
res.header("Access-Control-Allow-Headers", "X-Requested-With");
res.header("Access-Control-Allow-Methods","PUT,POST,GET,DELETE,OPTIONS");
res.header("X-Powered-By",'3.2.1')
res.header("Content-Type", "application/json;charset=utf-8");
next();});
2. 使用 nginx 反向代理,在配置文件 nginx.conf 中找到 server{}对象,更改项目地址 root 和配置代理地址 proxy_pass,这个方法适合前端静态文件使用:
location / {
root D:/browseClient/dist; #自己的前端项目地址
index index.html index.htm;
}
#解决跨域
location /api { # 自定义 nginx 接口前缀
proxy_pass http://127.0.0.1:3000; # 后台 api 接口地址
proxy_redirect default;
#设置主机头和客户端真实地址,以便服务器获取客户端真实 IP
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
3. 如果使用 vue-cli 搭建的项目,可以直接使用 proxyTable 模块,项目框架已经集成,找到配置文件在 /confif/index.j,如下配置
// 代理配置表,在这里可以配置特定的请求代理到对应的 API 接口
proxyTable:{
"/adv":{
target:"http://127.0.0.1:3000",// 需要访问的服务器地址
changeOrigin:true,//true 为开启代理
pathRewrite:{'^/adv': '/'// 路径的替换规则}
},"/user":{
target:"http://127.0.0.1:3000",// 访问的服务器地址
changeOrigin:true,//true 为开启代理
pathRewrite:{'^/user': '/'// 路径的替换规则}
}
}
显然,大部分情况我们不可能为每个 api 接口都在这加一个规则,所以更好的配置是:
proxyTable: {
'**': {
target: 'http://127.0.0.1:3000',
changeOrigin: true, // 允许跨域
}
}
或者
proxyTable: [{context: ['/**'],target: 'http://127.0.0.1:3000',changeOrigin: true, // 允许跨域
}]
是不是方便了很多
4. 其它,如 jsonp 是通过接口回调的方式实现跨域,这个现在已经用的少了。window.postMessage() 是 HTML5 的一个接口,专注实现不同窗口不同页面的跨域通讯。这些是对单个接口或者页面层面的跨域,使用也简单就不详细说了。
正文完