json解决前端跨域的问题

一、前言

  • 初识

XMLHttpRequest cannot load xxxx. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'xxxx' is therefore not allowed access. The response had HTTP status code 404.

timg.jpg

  • 什么跨域?
    简述:由于浏览器XMLHttpRequest同源策略(域名、端口、协议必须全一致)影响,禁止使用XHR对象向不同源服务器发起HTTP请求。
  • 为啥禁止跨域?
    简述:AJAX(XMLHttpRequest)同源策略主要用来防止CSRF攻击。我们发起的每一次HTTP请求都会带上请求地址对应的cookie,简单来说就是“模仿用户”访问“目标网站”。
  • 如何解决跨域?
    简述:解决跨域问题的方案有很多,例如JSONP、CROS、反向代理等等。
  • 今天我们就一起学习下,JSONP跨域解决方案的具体原理,以及实现封装一个自己的jsonp.js。

二、JSONP

大家都知道页面中,图片(img)是可引用外部的,js脚本文件(script)也可引入外部的,所以基本原理就是通过动态创建script标签,然后利用src属性进行跨域。

1. 基本原理

<body>
<script>
    function fn1(str) { alert('我是fn1:'+ str) }
</script>
<script>
    fn1('下面调用')
</script>
</body>

总结:上面代码想必大家都知道结果吧。会弹出“我是fn1:下面调用”

2. 百度搜索api简单使用

百度搜索的接口: https://sp0.baidu.com/5a1Fazu8AA54nxGko9WTAnF6hhy/su?wd=abc&cb=show

<script>
   function fn1(url){
        window.show = function(json){
            console.log(json);
        } 
        var oS = document.createElement('script');
        oS.src = url;
        document.head.appendChild(oS);
    }
    
    fn1('https://sp0.baidu.com/5a1Fazu8AA54nxGko9WTAnF6hhy/su?wd=abc&cb=show');
</script>

结果如下图所示


总结:从上图我们可以看出“abc”关键字的搜索结果可以展示了。也就是解决了跨域问题。

 

遗留问题:

    1. 创建的script标签,用完是不是需要删除?
    1. 关键字(此处搜索内容)是不是可以灵活进行自定义?
    1. 等等

JSONP方法完善以及封装

function json2url(json){
    var arr = [];
    for(var name in json){
        arr.push(name+'='+json[name]);
    }
    return arr.join('&');
}
/*
** @jsonp               jsonp跨域交互
** @params      
**                      [object]
*/
function jsonp(json){
    //参数初始值
    json = json||{};
    if(!json.url)return;
    //回调名字
    json.cbName = json.cbName||'cb';
    //超时时间(ms)
    json.timeout =json.timeout||15000;
    //提交数据
    json.data = json.data||{};
    //回调函数的名字(解决了缓存问题)
    json.data[json.cbName] = 'show'+Math.random();
    //把回调函数名字中的.去掉。
    json.data[json.cbName] = json.data[json.cbName].replace('.','');
    //网络超时
    json.timer = setTimeout(function(){
        window[json.data[json.cbName]] = function(){
            oHead.removeChild(oS);
            json.error&&json.error('亲,网络不给力');
        };
    },json.timeout);
    //定义回调函数(全局的)
    window[json.data[json.cbName]] = function(result){
        //把网络超时干掉
        clearTimeout(json.timer);
        //需要把script删除
        oHead.removeChild(oS);
        //执行成功回调函数
        json.success&&json.success(result);
    };
    //获取head标签。
    var oHead = document.getElementsByTagName('head')[0];
    //动态创建script
    var oS = document.createElement('script');
    //给script加src
    oS.src = json.url+'?'+json2url(json.data);
    //把script插入到head标签中
    oHead.appendChild(oS);
}

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值