一、同源策略javascript
想要了解跨域訪問,就要必須先了解同源策略。同源策略其實就是由Netscape提出的一個著名的安全策略。html
a、那爲何要提出同源策略呢?主要就是爲了安全。java
舉個例子,假如你正在訪問一家銀行的網站,而後你又打開了一個網站,這是一個惡意網站,惡意網站中的ajax請求銀行的網站,這時候請求會帶上銀行網站的cookie,此時數據就泄露了。jquery
b、那同源策略又是怎麼防範這種狀況的產生的呢?ajax
同源指的是兩個頁面擁有相同的協議、端口和主機。這樣,惡意網站中的ajax就不能攜帶你銀行網站的cookie請求你的銀行網站了。django
c、那爲何script能採用外部的連接?按照上面所講應該不能使用外部的jquery。json
那是由於雖然同源策略是Netscape提出的,可是倒是由瀏覽器廠家去執行的,他們將同源策略稍微改動了一下,也就是說,瀏覽器中的<script><img><iframe><link>等能夠直接加載跨域資源,而不受同源策略限制。被同源策略限制的行爲包括:cookie、localStorage和IndexDB沒法讀取;DOM沒法得到;AJAX請求不能發送。可是,瀏覽器限制了javascript,使其不能讀寫加載的內容。跨域
二、跨域請求瀏覽器
jsonp跨域安全
jsonp是數據格式json的一種使用模式,就是利用了script能夠直接加載跨域資源的特色。經過觀察network能夠看出,jsonp發送的get請求的類型是JS,而非XHR。
使用django簡單實現jsonp跨域請求:
index.html
<!DOCTYPE html> <html> <head> <title>JSONP</title> <script src="https://code.jquery.com/jquery-3.1.1.min.js"></script> </head> <body> <button class='jsop_test'>測試</button> <script> $(".jsop_test").click(function () { $.ajax({ url:"http://127.0.0.1:8008/jtest/service/", type:"get", dataType:"jsonp", // 僞造ajax 基於script jsonp: 'name', jsonpCallback:"laowang", success:function (data) { console.log(data) } }) }) </script> </body> </html>
views.py
from django.shortcuts import render from django.http import HttpResponse import json # Create your views here def Index(request): return render(request, "index.html", locals()) def jsonp_test(request): func = request.GET.get("callbacks", "") print(func) info = {"name":"laowang","age":18} return HttpResponse(json.dumps(info))
開啓兩個服務器,一個使用127.0.0.1:8000另外一個使用127.0.0.1:8008。這時,想要在8000端口的服務器請求8008端口的服務器,按照同源策略是不能請求的,可是,咱們將json改爲jsonp就能請求到了。若是不使用jsonp就會在console中報一下的錯誤。