"跨域及其解决方案?"

跨域及其解决方案?

由于浏览器的同源策略机制,使得在请求不同域名的接口数据的时候就会出现跨域问题。

解决跨域的方式:

1、JSONP
利用script标签不受跨域限制,通过动态创建script标签+回调函数实现跨域,当然这种方式只适用到get请求

原生方式

//原生的实现方式
let script = document.createElement('script');
script.src = 'http://www.nealyang.cn/login?username=Nealyang&callback=callback';
document.body.appendChild(script);
function callback(res) {
  console.log(res);
}

jquery方式

$.ajax({
    url:'http://www.nealyang.cn/login',
    type:'GET',
    dataType:'jsonp',//请求方式为jsonp
    jsonpCallback:'callback',
    data:{
        "username":"Nealyang"
    }
})

2、document.domain + iframe 跨域
这种方式要求主域名相同,如:a.test.com b.test.com,把window.domain都设置成test.com就可以了

3、window.name + iframe 跨域
window.name属性可设置或者返回存放窗口名称的一个字符串。他的神器之处在于name值在不同页面或者不同域下加载后依旧存在,没有修改就不会发生变化,并且可以存储非常长的name(2MB)
通过改取window.name实现数据传递的效果

4、location.hash + iframe 跨域
location.hash和window.name都是差不多的,都是利用全局对象属性的方法,然后这两种方法和jsonp也是一样的,就是只能够实现get请求

5、postMessage跨域
h5新推出的接口,IE8+都已实现,通知发送和监听来实现数据传递
子页面发送

sonWindow.postMessage({age: 24});

主页面监听

window.addEventListener("message", function(res) { 
  console.log(res);
}, false);

6、后端允许跨域
php方式

<?php
header(“Access-Control-Allow-Origin: *”); // *允许所以,也可以指定具体域名

7、通过proxy代理
通过配置devServer proxy实现

devServer: {
  publicPath: '/',
  port: 8000,
  proxy: {
    '/api': {
      target: 'http://www.test.com',
      changeOrigin: true,
      pathRewrite: {
        "/api": "/api"
      }
    },
  }
},

nginx配置

location /api {
  proxy_pass http://www.test.com;
}
PS:写作不易,如要转裁,请标明转载出处。
登录
注册
回顶部