同源策略(Same origin policy)是一種約定,它是瀏覽器最核心也最基本的安全功能,若是缺乏了同源策略,則瀏覽器的正常功能可能都會受到影響。javascript
能夠說Web是構建在同源策略基礎之上的,瀏覽器只是針對同源策略的一種實現。html
域名、協議、端口相同,也就是在同一個域裏。java
例如:jquery
一個域的頁面去請求另外一個域的資源;ajax
A域的頁面去請求B域的資源。django
動態添加一個<script>標籤,而script標籤的src屬性是沒有跨域的限制的。json
這樣一來,這種跨域方式就與ajax XmlHttpRequest協議無關了。跨域
JSONP即JSON with Padding瀏覽器
因爲同源策略的限制,XmlHttpRequest只容許請求當前源(域名、協議、端口)的資源。安全
若是要進行跨域請求, 咱們能夠經過使用html的script標記來進行跨域請求,並在響應中返回要執行的script代碼,其中能夠直接使用JSON傳遞javascript對象,這種跨域的通信方式稱爲JSONP。
JSON 是一種數據格式
JSONP 是一種數據調用的方式
首先在客戶端註冊一個callback (如:'TestJsonpCallback'), 而後把callback的名字(如:testjsonpcallback)傳給服務器。
注意:
服務端獲得callback的數值後,要用TestJsonpCallback(......)把將要輸出的json內容包括起來,此時,服務器生成 json 數據才能被客戶端正確接收。
而後以 javascript 語法的方式,生成一個function, function 名字就是傳遞上來的參數 'callback'的值 TestJsonpCallback.
最後將 json 數據直接以入參的方式,放置到 function 中,這樣就生成了一段 js 語法的文檔,返回給客戶端。
客戶端瀏覽器,解析script標籤,並執行返回的 javascript 文檔,此時javascript文檔數據,做爲參數, 傳入到了客戶端預先定義好的 callback 函數.
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <script src="/static/jquery.js"></script> </head> <body> <h1>index</h1> {#<button onclick="fasong">點擊發送</button>#} <p> <input type="button" onclick="Jsonp1();" value='提交'/> </p> <p> <input type="button" onclick="Jsonp2();" value='提交'/> </p> <script> function Jsonp1() { var tag = document.createElement('script'); tag.src = "http://127.0.0.1:8888/data/"; document.head.appendChild(tag); {#document.head.removeChild(tag);#} } function Jsonp2() { $.ajax({ url: "http://127.0.0.1:8888/data/", type: 'GET', dataType: 'JSONP', jsonp: 'callback', {#jsonpCallback: 'asdasdasd',#} success:function (data) { console.log(data) } } ) } </script> </body> </html>
from django.conf.urls import url from django.contrib import admin from app01 import views urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^jsonp/', views.index), ] urls.py
from django.shortcuts import render def index(request): return render(request,'index.html')
STATIC_URL = '/static/' STATICFILES_DIRS = ( os.path.join(BASE_DIR, 'static'), )
from django.conf.urls import url from django.contrib import admin from app01 import views urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^data/', views.data), ] urls.py
from django.shortcuts import render, HttpResponse # Create your views here. def data(request): callback = request.GET.get('callback') return HttpResponse('%s("數據")' % callback)
用訪問端訪問目標主機,目標主機能成功返回 "函數名("參數")" , 表示成功跨域。