WEB前端跨域知识总结—JSONP

一、前言

  • 初识

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);
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 161,192评论 4 369
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,186评论 1 303
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 110,844评论 0 252
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,471评论 0 217
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,876评论 3 294
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,891评论 1 224
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,068评论 2 317
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,791评论 0 205
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,539评论 1 249
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,772评论 2 253
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,250评论 1 265
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,577评论 3 260
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,244评论 3 241
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,146评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,949评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,995评论 2 285
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,812评论 2 276

推荐阅读更多精彩内容

  • Section1、为什么要跨域? 自古以来(1995年起),为了用户的信息安全,浏览器就引入了同源策略。那么同源策...
    qhaobaba阅读 370评论 0 0
  • Section1、为什么要跨域? 自古以来(1995年起),为了用户的信息安全,浏览器就引入了同源策略。那么同源策...
    不去解释阅读 476评论 0 0
  • 同源策略 理解跨域首先必须要了解同源策略。同源策略是浏览器上为安全性考虑实施的非常重要的安全策略。何谓同源:URL...
    48892085f47c阅读 704评论 0 6
  • 前言相信每一个前端er对于跨域这两个字都不会陌生,在实际项目中应用也是比较多的。但跨域方法的多种多样实在让人目不暇...
    Www刘阅读 659评论 2 23
  • 人们脆弱的时候,总想找个人或者物件抱一抱,家居中 找一个好的枕芯,抱在怀里才最有肉感 PP棉的枕芯填充物其实就是一...
    窗爸爸家居阅读 213评论 0 0