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閱讀 229,460評論 6 538
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,067評論 3 423
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,467評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,468評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,184評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,582評論 1 325
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,616評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,794評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,343評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,096評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,291評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,863評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,513評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,941評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,190評論 1 291
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,026評論 3 396
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,253評論 2 375

推薦閱讀更多精彩內容

  • 本節內容:實現跨域常用的兩種方式 —— JSONP 和 CORS 零:跨域報錯展示 在非同源情況下,調用 Ajax...
    NathanYangcn閱讀 3,265評論 2 12
  • 1.什么是同源策略 同源策略(Same origin Policy):瀏覽器出于安全方面的考慮,只允許與本域下的接...
    hellowade閱讀 192評論 0 0
  • Section1、為什么要跨域? 自古以來(1995年起),為了用戶的信息安全,瀏覽器就引入了同源策略。那么同源策...
    不去解釋閱讀 567評論 0 0
  • 題目1: 什么是同源策略 瀏覽器出于安全考慮,只允許與本域下的接口交互。不同源的客戶端腳本在沒有明確授權的情況下,...
    saintkl閱讀 240評論 0 0
  • 1: 什么是同源策略 最初,它的含義是指,A網頁設置的 Cookie,B網頁不能打開,除非這兩個網頁"同源",所謂...
    好奇而已閱讀 306評論 0 0