jsonp原理,跨域請求頭處理


.jsonp(解決跨域)思路介紹:

因瀏覽器的同源策略不會攔截link標簽內的src請求,所以利用這一點,我們把后端開放的接口路徑放在src,

其在發送請求后會自動接收返回的東西,所以我們可以給要返回的內容進行特殊的處理;具體做法:

1. 使用個變量加括號的形式,把要返回的內容放入括號內

       列如: return HttpResponse( "handlerResponse('返回內容')" )

2. html頁面script標簽對內放置個函數,讓函數名等同於后端傳來的變量名即可

 function handlerResponse(data) {   # data參數接收的就是后端真正想要返回的內容.

    // do something....

    alert(data)

}

3. 原理: 前端src出接收到的內容就是handlerResponse('返回內容')這種形式,html頁面內又定義了

   handlerResponse為一個函數名,加括號就是調用的形式,正好會把其所要傳送的東西以參數的形式被

   data所接收,此時在函數內操作處理即可.

缺點: jsonp只能發送get請求,無法處理post請求,get請求時無法指定contentytype

 

.加請求頭方式:

我們先了解下跨域請求的分類(簡單和復雜):

 

HTTP方法是下列方法之一

  HEADGETPOST

HTTP頭信息不超出以下幾種字段

  AcceptAccept-LanguageContent-LanguageLast-Event-ID

  Content-Type只能是下列類型中的一個

    application/x-www-from-urlencoded   # form表單提交數據

    multipart/form-data  # 權限類型

    text/plain  # 文本類型

任何一個不滿足上述要求的請求,即會被認為是復雜請求~~

復雜請求會先發出一個預請求,我們也叫預檢,即OPTIONS請求~~

原理,在請求返回給瀏覽器前,給響應內容加上頭部信息,讓瀏覽器放行即可.

 

from django.utils.deprecation import MiddlewareMixin
class MyCors(MiddlewareMixin):
    def process_response(self, request, response):
        response["Access-Control-Allow-Origin"] = "*"  # 放行所有簡單請求
        if request.method == "OPTIONS":
            # 復雜請求會先發預檢
            response["Access-Control-Allow-Headers"] = "Content-Type"  # 內容類型
            response["Access-Control-Allow-Methods"] = "PUT,PATCH,DELETE" # 復雜請求方式
        return response


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM