跨域

JSONP

html中可以通过script标签引入其他域的js,利用这一特性,结合后端支持,可以实现跨域访问接口
实现原理:

  • 定义数据处理函数_fun
  • 创建script标签,src的地址执行后端接口,最后加个参数callback=fun
  • 服务端在收到请求后,解析参数,计算返还数据,输出 fun(data) 字符串。
  • fun(data)会放到script标签做为js执行。此时会调用fun函数,将data做为参数。

前端代码:

后端代码:

router.get('/getFriends', function(req, res) {
        var username = req.query.username ;// 通过 req.query获取请求参数
        var friends;
    
    //根据请求参数mock数据
    switch (username){
        case 'ruoyu':
            friends = ['小米', '小刚'];
            break;
        case 'hunger':
            friends = ['小谷', '小花'];
            break;
        default:
            friends = ['没有朋友'];
    }
    var cb=req.query.callback;
    res.send(cb+'('+JSON.stringify(friends)+')')
    });

CORS

CORS 全称是跨域资源共享(Cross-Origin Resource Sharing),是一种 ajax 跨域请求资源的方式,支持现代浏览器,IE支持10以上。
实现方式:

  • 使用XMLHttpRequest发送请求时,服务器发现不同源会在请求中加一个请求头Origin
  • 后台确定接受该请求,则在响应头中加一个Access-Control-Allow-Origin
  • 浏览器判断该响应头中包含origin则响应请求,没有不响应

前端代码:

后端代码:

router.get('/getFriends', function(req, res) {
        var username = req.query.username ;// 通过 req.query获取请求参数
        var friends;
    //根据请求参数mock数据
    switch (username){
        case 'ruoyu':
            friends = ['小米', '小刚'];
            break;
        case 'hunger':
            friends = ['小谷', '小花'];
            break;
        default:
            friends = ['没有朋友'];
    }
        res.header("Access-Control-Allow-Origin", "http://b.test.com:8080");
        res.send(friends);
    });

降域

降域的使用条件是两个名的一级域名相同(例如: a.test.com 与 b.test.com)都同属于test.com这个域名
在各自的域下被访问文件里,添加document.domain='test.com'即可。

PostMessage

使用window.postMessage() 实现
postMessage的原理是会向另一个地方发送信息,另一个地方通常是iframe,或者是由当前页面弹出的窗口。参数是:信息以及表示接受消息方的来自哪个域的字符串,如果给定*便是不限定接受者的域。


    

    

使用postMessage实现跨域


    

    
    

    

你可能感兴趣的:(跨域)