JSONP

题目1: 什么是同源策略

浏览器出于安全性能的考虑,只允许与同源接口进行数据传递,不同源的客户端本在没有明确授权的情况下,不能读写对方的资源。

同源指的是:

  • 同协议:如http,https,file
  • 同域名:第一个 // 之间 /,就是网站的域名。
  • 同端口:http://jirengu.com:80/ 80就是端口号

题目2: 什么是跨域?跨域有几种实现形式

不同源的网站之前相互传递数据
跨域的实现形式:

  1. JSONP
  2. CORS
  3. 降域
  4. postMessage

题目3: JSONP 的原理是什么

JSONP的原理
利用<script src="xxx">发出get请求,然后浏览器对于这个src=''xxx'' 并不会监视,所以,我们就可以去发送请求,请求拿到的数据会被当做JS文件来运行,这个时候,对方只需要将所需要的数据用浏览器也支持,JS也能支持的语言格式传递,我们就能获得相应数据,而JSON语言是既符合这两个特点,使用起来也方便,所以叫JSONP.

JSONP实现的步骤

  1. 首先要定义好回调函数。
  2. 发出src的请求,然后,前端和别的网站的后端需要约定好 查询参数,比如都叫callback=showme
  3. 后端接收请求,也制定好了callback要传递的回去的数据,并且,要将前端的函数名字一并传递过去。因为,如果没有传递过去,前端的js可能并不能正常运行。
    例如:


    router.js

上述图中outseacher就是 callback的值,也就是前端的函数名。
4 . 前端拿到数据,按照事先制定好的函数,处理数据。

4.CORS是什么

cors是可以理解为加强版的Ajax。
既然Ajax不错,用起来也方便,我们就可以制定在双方都同意的情况下,允许跨域来传递数据。
Ajax运用XMLHttpRuquest的时候,服务器在请求的头部加了一个origin.
如果这个网站同意来自不同源的请求的时候,可以在回应的头部写上,
Access-Control-Allow-Origin

cors

例如这样,在回应信息里面加上'Access-Control-Allow-Origin' 就可以允许别人来获得信息了,当然,也可以指定只接受来自某个网站的请求,'*'代表任意。

5.用三种以上不同的方式来演示跨域过程。

1 . JSONP
代码:

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title>成绩查询</title>
    <style type="text/css">
        button {
            color:red;
            border:1px solid red;
            display:inline-block;
            padding:10px 10px 5px 5px;
        }
    </style>
</head>
<input type="text" name="haha">
<div class="grade"></div>
<button>查询</button>
<script>
    var $=function(x){
        return document.querySelector(x)
    }
    $('button').addEventListener('click',function(){
        var script=document.createElement('script')
        script.src='http://sys521.com:8080/seachgrade?callback=seach'
        document.head.appendChild(script)
        document.head.removeChild(script)
    })
    function seach(username){
            var arr=[]
            for (key in username){
                arr.push(key)
            }
            console.log(arr)
            var b=arr.indexOf($('input').value)
            if(b===-1){
                return $('.grade').innerText= $('input').value+'是谁'
            }else{
                return $('.grade').innerText=username[arr[b]]
            }
    }
</script>
</body>
</html>

mock sever

router.get('/seachgrade',function(req,res){
    var grade={'小明':100,'小刚':98,'小红':97}
    var outseacher= req.query.callback;
    if(outseacher){
        res.send(outseacher+'('+JSON.stringify(grade)+')')
    }else{
        res.send(grade)
    }
})
JSONP效果演示
  1. CORS
    代码:
<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title>输入验证码</title>
    <style>
        .getcode,input {
            display:inline-block;
        }
        .getcode{
            border:1px solid;
            word-spacing: 4px;
        }
    </style>
</head>
<body>
<span>请输入验证码:</span>
<input type="text">
<span>验证码</span>
<div class="getcode"></div>
<button>提交</button>
<script>
    var input=document.querySelector('input')
    var getcode=document.querySelector('.getcode')
    var btn=document.querySelector('button')
    input.addEventListener('focus',function(){
        var xhr=new XMLHttpRequest()
        xhr.onreadystatechange=function(){
            if(xhr.readyState===4 && (xhr.status===200 || xhr.status === 304)){
                var result=JSON.parse(xhr.responseText)
                getcode.innerText=result.join('')
            }else{
                getcode.innerText='断网了'
            }
        }
        xhr.open('get','http://sys521.com:8080/getCode',true)
        xhr.send()
    })
    btn.onclick=function(){
        if(input.value===getcode.innerText){
            alert('答对了')
        }else{
            alert('error')
        }
    }
</script>
</body>
</html>

mock sever

app.get('/getCode',function(req,res){
    var a=[]
    var b=[0,1,2,3,4,5,6,7,8,9,'a','b','c','d','e','f']
    for(var i=0;i<4;i++){
        var c=Math.floor(Math.random()*15)
        a.push(b[c])
    }
    res.header('Access-Control-Allow-Origin','*')
    res.send(JSON.stringify(a))
})
CORS

3 .降域
代码

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
</head>
<body>
<div class="ct">
    <input class="aa" type="text" placeholder="a.lpf123.com/a.html">
</div>
<iframe src="http://b.lpf123.com:8080/b.html">
</iframe>
<script>
    document.querySelector('.aa').addEventListener('input', function(){
        window.frames[0].document.querySelector('input').value=this.value
    })
    document.domain= 'lpf123.com'
</script>
</body>
</html>
<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
</head>
<body>
<input type="text" placeholder="b.lpf123.com">
<script>

    document.querySelector('input').addEventListener('input', function(){
        window.parent.document.querySelector('input').value = this.value;
    })
    document.domain ='lpf123.com'
</script>

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

推荐阅读更多精彩内容

  • 本节内容:实现跨域常用的两种方式 —— JSONP 和 CORS 零:跨域报错展示 在非同源情况下,调用 Ajax...
    NathanYangcn阅读 3,244评论 2 12
  • 1.什么是同源策略 同源策略(Same origin Policy):浏览器出于安全方面的考虑,只允许与本域下的接...
    hellowade阅读 185评论 0 0
  • Section1、为什么要跨域? 自古以来(1995年起),为了用户的信息安全,浏览器就引入了同源策略。那么同源策...
    不去解释阅读 551评论 0 0
  • 题目1: 什么是同源策略 浏览器出于安全考虑,只允许与本域下的接口交互。不同源的客户端脚本在没有明确授权的情况下,...
    saintkl阅读 234评论 0 0
  • 1: 什么是同源策略 最初,它的含义是指,A网页设置的 Cookie,B网页不能打开,除非这两个网页"同源",所谓...
    好奇而已阅读 300评论 0 0