三、服務端解決跨域請求
上述我們介紹了如何在客戶端解決跨域請求問題,同樣我們可以在服務端進行設置處理,是否還記得在我們不做任何處理的時候,跨域請求時候瀏覽器給我們報的錯誤不?如下,翻譯過來就是因為相應頭沒有指定Access-Control-Allow-Origin所允許原始的請求路徑,因此原始請求路徑http://127.0.0.1:8001不被允許訪問。
基於上述的原因解釋,我們只需要在響應的內容加入上述這樣的授權字段,便可解決,實例如下:
項目1客戶端請求代碼:(路徑為:http://127.0.0.1:8001)
<script> $(".ajax_btn").click(function () { $.ajax({ url:"http://127.0.0.1:8002/send_ajax/", success:function (data) { alert(data); console.log(data) } }) }); </script>
項目2服務端被請求的路徑:
def send_ajax(request): import json dic={"k1":"v1"} print("ok") response=HttpResponse(json.dumps(dic)) response["Access-Control-Allow-Origin"]="http://127.0.0.1:8001" return response
如上方式,在服務端相應內容中加入response["Access-Control-Allow-Origin"]="http://127.0.0.1:8001"字段后,http://127.0.0.1:8001路徑就可以跨域請求此路徑下的內容,如果將其設置成response["Access-Control-Allow-Origin"]="*"表示所有的客戶端都可以請求此服務器下此路徑。
上述這種方式雖然在服務端解決了跨域請求的問題,但是通過上述設置方式,顯然不靈活,我們應該訪問路徑的實際情況進行判斷,然后再決定要不要給其跨域返回內容,解決辦法可以將服務器代碼改為如下:
def send_ajax(request): import json dic={"k1":"v1"} HttpOrigins=["http://127.0.0.1:8001","http://127.0.0.1:8003","http://127.0.0.1:8005"] print(request.META.get("HTTP_ORIGIN")) #可以取得請求路徑的origin HttpOrigin=request.META.get("HTTP_ORIGIN") if HttpOrigin in HttpOrigins: response=HttpResponse(json.dumps(dic)) response["Access-Control-Allow-Origin"]=HttpOrigin return response
PS:
上述講述的都是基於get請求的情況,假如我們在客戶端利用PUT形式進行請求,因為put請求屬於上傳文件的請求方式,而http協議對此請求方式未做驗證,即請求便能成功,顯然不合理,所以瀏覽器給給其增加了預檢,即put請求提交時,客戶端實際提交的請求方式為OPTIONS,只有在服務端對其進行了驗證后,才會繼續提交正真put請求。上述的服務端跨域put形式請求可以改寫為如下:
def send_ajax(request): if request.method=="OPTIONS":#預檢 response=HttpResponse() response["Access-Control-Allow-Methods"]="PUT" response["Access-Control-Allow-Origin"] = "http://127.0.0.1:8001" return response elif request.method=="PUT": import json dic = {"k1": "v1"} response = HttpResponse(json.dumps(dic)) response["Access-Control-Allow-Origin"] = "http://127.0.0.1:8001" return response