跨域
跨域是指一个域下的文档或脚本试图去请求另一个域下的资源,这里跨域是广义的。
广义的跨域:
| 1 | 1.) 资源跳转: A链接、重定向、表单提交 | 
同源政策
同源策略/SOP(Same origin policy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,浏览器很容易受到XSS、CSFR等攻击。所谓同源是指”协议+域名+端口”三者相同,即便两个不同的域名指向同一个ip地址,也非同源。
同源策略限制以下几种行为:
| 1 | 1.) Cookie、LocalStorage 和 IndexDB 无法读取 | 
常见跨域场景
| 1 | URL 说明 是否允许通信 | 
跨域解决方案
- jsonp - jsonp的原理就是利用 - <script>标签没有跨域限制,通过- <script>标签src属性,发送带有callback参数的GET请求,服务端将接口返回数据拼凑到callback函数中,返回给浏览器,浏览器解析执行,从而前端拿到callback函数返回的数据。- 1 - <script src = 'http://www.domain2.com:8080/login?user=admin&callback=handleCallback'/> - jsonp(只支持get请求,支持老的IE浏览器)适合加载不同域名的js、css,img等静态资源; 
- document.domain+iframe适合主域名相同,子域名不同两个页面的跨域请求,可以在两个页面设置document.domain = “主域名” 。 - 例如:http://A.h5course.com/a.html页面和http://B.h5course.com/b.html页面能够相互访问,可以在两个文件中设置document.domain = “h5course.com”,两个页面文档里通过iframe引入对方的文件。 - iframe元素:iframe 元素会创建包含另外一个文档的内联框架(即行内框架)。 
- react项目在package.json中使用proxy(代理)配置可以解决跨域问题 - 1 
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11- "proxy": { 
 "/api/admin": {
 "target": "http://localhost:12610",
 "pathRewrite": {
 "^/api/admin": "/"
 }
 },
 "/api": {
 "target": "http://47.74.215.209:9000"
 }
 }
- 设置webpack 的proxy 代理实现跨域 - 1 
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16- dev: { 
 env: require('./dev.env'),
 port: 8080,
 autoOpenBrowser: true,
 assetsSubDirectory: 'static',
 assetsPublicPath: '/',
 proxyTable: {
 '/api': {
 target: 'http://www.abc.com', //目标接口域名
 changeOrigin: true, //是否跨域
 pathRewrite: {
 '^/api': '/api' //重写接口
 }
 },
 cssSourceMap: false
 }
- 使用 http-proxy-middleware 代理跨域 - a. 安装 - http-proxy-middleware- 1 
 2- $ npm install http-proxy-middleware --save 
 $ # or$ yarn add http-proxy-middleware- b. 创建 - src/setupProxy.js- c. 第三步 设置代理 - 1 
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24- // setupProxy.js 
 const { createProxyMiddleware } = require('http-proxy-middleware');
 module.exports = function(app) {
 app.use(
 '/api', //使用"/api"来代替"http://localhost:3000"
 createProxyMiddleware({
 target: 'http://localhost:3000', //源地址
 changeOrigin: true, //改变源
 pathRewrite: {
 '^/api': 'http://localhost:3000' //路径重写
 }
 })
 );
 app.use(
 '/apc',
 createProxyMiddleware({
 target: 'https://test.tosharing.com',
 changeOrigin: true,
 pathRewrite: {
 '^/api': 'https://test.tosharing.com'
 }
 })
 );
 };
- CORS跨域资源共享