国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

面試整理(2)跨域:jsonp與CORS

番茄西紅柿 / 2237人閱讀

摘要:也就是說,一般情況下瀏覽器向服務器發送請求得到的都是數據文本,,,但是當采用技術時候,瀏覽器向跨域服務器發送請求,得到的是回調函數包住的。

問題:跨域有哪些方法?jsonp的原理是什么?

jsonp:

先說jsonp,jsonp的主要原理是利用script標簽的src可以跨域請求,據說有src屬性的都可以跨域請求,但script標簽返回的會直接執行,所以都是用script請求。jsonp=json+padding,padding是指服務器返回數據時把數據用padding(函數)包裹了起來。也就是說,一般情況下瀏覽器向服務器發送請求得到的都是數據(文本,XML,JSON),但是當采用JSONP技術時候,瀏覽器向跨域服務器發送請求,得到的是回調函數包住的JSON。此處JSON作為參數傳入回調函數,然后再返回給瀏覽器。

這里寫一個例子:其中后臺用的nodejs

前端代碼:index.html


    
    
        

后臺代碼:server.js

var http = require(http)
var url = require(url)

http.createServer(function(req,res){
    var param = url.parse(req.url, true).query
    var callback = param.callback
    var data = {
        text: "hello world"
    }
    var resStr = callback+"("+JSON.stringify(data)+")"
    res.write(resStr)
    res.end()
}).listen(3000)

上面的例子中,index.html中定義了一個jsonpcallback函數,并且把這個函數名通作為callback字段的值以get的請求(src的請求只能是get)發送給服務端。服務端接收到之后通過callback字段拿到回調函數名,然后用這個函數名包裹要返回的數據,形成一個字符串,發給前端

例子在node環境下運行:node server.js,然后再運行index.html就可以看到前端跨域請求的結果。例子中由于index.html是本地的,所以跟服務器不同源,普通的請求會被拒絕。

服務端寫的時候要注意,返回的是一個很像函數調用的字符串,它不并不是后臺對callback函數的調用,所以要把返回的對象用JSON.stringify轉化一下,再加上字符串的兩個括號

CORS:

jsonp說完之后,再說一個常用的跨域方法CORS。主要參考阮一峰大神的資料:http://www.ruanyifeng.com/blog/2016/04/cors.html

CORS分簡單請求和非簡單請求,同時滿足下面兩個條件的就是簡單請求,否則就是非簡單請求

簡單請求:請求頭通過Origin字段用來說明,本次請求來自哪個源(協議 + 域名 + 端口)。服務器根據這個值,決定是否同意這次請求。

 我在實際測試時先不使用關于cookie的一些可選字段,就簡單的在前端設置Origin在后端設置Access-Control-Allow-Origin這種必須的字段來測試。

發現前端的ajax設置Origin字段會報錯-》Refused to set unsafe header "Origin"

雖然不影響請求的發送,但設置的Origin字段是無效的,不管我設置什么或者不設置這個字段時查看Origin字段時它的值都是null,網上查了之后在stackoverflow上有人說那個Origin字段本來就應該是瀏覽器來設置的,自己設置不安全。

猜想只要瀏覽器發現請求的目標不是同源的,就會自己給報文加Origin字段。所以只要在后端設置Access-Control-Allow-Origin字段為*(表示接受任意Origin的請求)就可以了。

前端代碼:簡單的ajax即可

服務端代碼:server.js

var http = require(http)

http.createServer(function(req,res){
    res.writeHead(200, {
        Access-Control-Allow-Origin : *
    });
    res.write("hello world!")
    res.end()
}).listen(3000)

 非簡單請求:除去可選字段,在非簡單請求中服務端還要指定Access-Control-Request-Method來表示自己接受的請求的方法,把之前的ajax中的方法從get改為put

前端代碼:index.html


    
    
        

如果后臺沒有在Access-Control-Request-Method中添加put方法就會報錯-》Failed to load http://localhost:3000/: Method PUT is not allowed by Access-Control-Allow-Methods in preflight response.

后端代碼:server.js

var http = require(http)
var url = require(url)

http.createServer(function(req,res){
    res.writeHead(200, {
        Access-Control-Allow-Origin : *,
        Access-Control-Allow-Methods : GET, POST, PUT
    });
    res.write("hello world!")
    res.end()
}).listen(3000)

添加了Access-Control-Request-Method:“PUT”后請求成功。

非簡單方法瀏覽器會先發起一個method為OPTION的“預檢”來跟服務器驗證自己的請求是不是被允許,如果服務器回的頭中沒有請求的方法或者參數,那么瀏覽器就知道不允許,將不發送ajax請求。如果有,瀏覽器才會再發送那個ajax請求。

“預檢”請求:

 

CORS和jsonp的區別主要在于:jsonp只支持get請求,而CORS支持所有類型的請求,只不過CORS要求至少IE10,jsonp兼容以前的版本。

 

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/2193.html

相關文章

  • 前端面試整理

    摘要:主要講講新增哪些地理定位,拖放,存儲應用緩存,,。使用嚴格模式的限制有哪些。同源協議,域名,端口相同方法一。方法是在原數組上進行操作。如何設置一個未知寬高的對話框在頁面中絕對居中。 1.HTML5的新特性。 主要講講新增哪些API:地理定位,拖放,web存儲應用緩存,webworkers, sse 。 http://www.w3school.com.cn/html5/html_5_in...

    gaomysion 評論0 收藏0
  • 前端面試整理

    摘要:主要講講新增哪些地理定位,拖放,存儲應用緩存,,。使用嚴格模式的限制有哪些。同源協議,域名,端口相同方法一。方法是在原數組上進行操作。如何設置一個未知寬高的對話框在頁面中絕對居中。 1.HTML5的新特性。 主要講講新增哪些API:地理定位,拖放,web存儲應用緩存,webworkers, sse 。 http://www.w3school.com.cn/html5/html_5_in...

    cartoon 評論0 收藏0
  • 前端面試整理

    摘要:主要講講新增哪些地理定位,拖放,存儲應用緩存,,。使用嚴格模式的限制有哪些。同源協議,域名,端口相同方法一。方法是在原數組上進行操作。如何設置一個未知寬高的對話框在頁面中絕對居中。 1.HTML5的新特性。 主要講講新增哪些API:地理定位,拖放,web存儲應用緩存,webworkers, sse 。 http://www.w3school.com.cn/html5/html_5_in...

    seanHai 評論0 收藏0
  • 一篇文章搞明白CORS跨域

    摘要:跨域實在是面試官一個人的利器。首先,什么是是一個標準,全稱是跨域資源共享。它的值是一個布爾值,表示是否允許發送。設為,即表示服務器明確許可,可以包含在請求中,一起發給服務器。 面試問到數據交互的時候,經常會問跨域如何處理。大部分人都會回答JSONP,然后面試官緊接著就會問:JSONP缺點是什么啊?這個時候坑就來了,如果面試者說它支持GET方式,然后面試官就會追問,那如果POST方式發送...

    tanglijun 評論0 收藏0
  • 前端跨域整理

    摘要:前言原文地址前端跨域總結博主博客地址的個人博客相信每一個前端對于跨域這兩個字都不會陌生,在實際項目中應用也是比較多的。通過跨域前面說過了,瀏覽器有一個同源策略,其限制之一是不能通過的方法去請求不同源中的文檔。 前言 原文地址:前端跨域總結 博主博客地址:Damonare的個人博客 相信每一個前端er對于跨域這兩個字都不會陌生,在實際項目中應用也是比較多的。但跨域方法的多種多樣實在讓人目...

    yankeys 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<