CORS跨域請求之簡單請求與非簡單請求


先來看一個例子

定義server01的項目,在路由表中添加一條路由記錄

url(r'^getData.html$',views.get_data)

對應的視圖函數

    from django.shortcuts import render,HttpResponse
    
    def get_data(request):
    
        response=HttpResponse("server----001")
        return response

定義server02項目,在路由表中添加一條路由記錄

url(r'^index.html/',views.index),

對應的視圖函數

    from django.shortcuts import render
    
    def index(request):
    
        return render(request,"index.html")

對應的index.html文件

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    <h1>server----002</h1>
    <script src="/static/jquery-3.2.1.js"></script>
    <script>
        $.ajax({
            url:'http://127.0.0.1:8000/getData.html',
            type:'GET',
            success:function(data){
                console.log(data);
            }
        })
    </script>
    </body>
    </html>

運行server01項目,使用8100端口打開server02的index.html網頁,可以看到如下信息

發送這個請求使用的是GET方法.如果把server02的index.html網頁中設定為使用PUT方法發送請求,會看到什么情況呢?

index.html中的請求方法修改為PUT,然后刷新瀏覽器

可以看到網頁上顯示的request method變成了OPTIONS,可是在網頁中聲明的請求方法是PUT

為什么會出現這樣的情況呢???這就涉及到簡單請求非簡單請求了.

簡單請求就是使用設定的請求方式請求數據
而非簡單請求則是在使用設定的請求方式請求數據之前,先發送一個OPTIONS請求,看服務端是否允許客戶端發送非簡單請求.
    只有"預檢"通過后才會再發送一次請求用於數據傳輸

簡單請求與非簡單請求的區別

* 請求方式:HEAD,GET,POST
* 請求頭信息:
    Accept
    Accept-Language
    Content-Language
    Last-Event-ID
    Content-Type 對應的值是以下三個中的任意一個
                        application/x-www-form-urlencoded
                        multipart/form-data
                        text/plain

只有同時滿足以上兩個條件時,才是簡單請求,否則為非簡單請求

如果在上面的例子中,在server01中設定響應頭,

    from django.shortcuts import render,HttpResponse
    
    def get_data(request):
        if request.method=="OPTIONS":
        
            response=HttpResponse()
            response['Access-Control-Allow-Origin']="*"
            response['Access-Control-Allow-Methods']="PUT"
            return response
        elif request.method =="PUT":
        
            response=HttpResponse("server----001")
            response['Access-Control-Allow-Origin']="*"
            return response

再次刷新http://127.0.0.1:8100/index.html/網頁,可以看到

先發送的是OPTIONS請求,第二次發送的是PUT請求,而且獲取到目標字符串.

由此得知,對於非簡單請求,客戶端以PUT方式請求數據,服務端的"預檢"里邊一定要包含允許客戶端使用非簡單方式請求數據的響應頭

“預檢”請求時,允許請求方式則需服務器設置響應頭:Access-Control-Request-Method
“預檢”請求時,允許請求頭則需服務器設置響應頭:Access-Control-Request-Headers
“預檢”緩存時間,服務器設置響應頭:Access-Control-Max-Age

雖然可以通過設置響應頭和響應方式等支持非簡單請求,但是不到萬不得已的情況,不能允許客戶端發送非簡單請求.

因為非簡單請求會使服務器比簡單請求的多一倍的壓力.


免責聲明!

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



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