一、同源策略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中报一下的错误。