先后端分离以后,开发阶段接口联调就会出现ajax跨域问题。
固然,跨域问题的解决方案仍是挺多的,这里梳理下我接触到的几种方案。前端
Chrome
的同源策略目测这是最简单粗暴的方案node
能够经过使用Chrome
命令行启动参数来改变Chrome
浏览器的设置。
这里使用的是disable-web-security
参数,这个参数能够下降Chrome
浏览器的安全性,禁用同源策略。要支持跨域,还须要加上user-data-dir
。webpack
下面以Windows
为例。
1.先关闭全部的Chrome
窗口。
2.新建一个Chrome
快捷方式,右击->属性->快捷方式。
3.在目标(T)
中设置参数:nginx
--args --disable-web-security --user-data-dir
4.点击应用/肯定,以这个快捷方式打开Chrome
浏览器,效果以下:web
webpack-dev-server
代理devServer: { ... proxy: { '/api': { target: 'http://127.0.0.1:8080', pathRewrite: {'^/api': '/api/v1'} } } }
将 '/api' 经过本地开发服务器webpack-dev-server
转发到 'http://127.0.0.1:8080',即转发到后端服务。pathRewrite
用于路径转换,具体取决于你请求的uri
与后端服务实际uri
的差别,好比你本地起的80
端口,你的uri
为 'http://localhost/api',将为转换成 'http://127.0.0.1:8080/api/v1'。
详细配置请移步 webpack devServer。ajax
nginx
反向代理http { ... server { ... location /api/ { proxy_pass http://127.0.0.1:8080 } } }
CORS
接口
CORS
须要浏览器和服务器同时支持。目前全部现代浏览器都支持该功能,IE
浏览器不能低于IE10
。
对于前端开发者来讲,CORS
通讯与同源的AJAX
通讯没有差异,代码彻底同样。express
后端实现CORS
接口只需合理设置Response Header
,以node
为例:后端
const express = require('express'); let app = express(); app.all('*', (req, res, next) => { res.setHeader('Access-Control-Allow-Origin', '*'); res.setHeader('Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content-Type, Accept'); res.setHeader('Access-Control-Allow-Methods', 'PUT,POST,GET,DELETE,OPTIONS'); next(); }); ...