同源策略,浏览器拒毫不是当前域返回的数据。 好比: 当你从其余网站向百度发送请求的时候,百度在执行完后会返回数据给你,可是该返回的数据由于不是在同一个域下,因此浏览器会给你拒绝掉该数据
已拦截跨源请求:同源策略禁止读取位于 http://127.0.0.1:8001/SendAjax/ 的远程资源。(缘由:CORS 头缺乏 'Access-Control-Allow-Origin')。
可是注意,当项目中的访问已经发生了,说明是浏览器对非同源请求返回的结果作了拦截javascript
只要同时知足如下两大条件,就属于简单请求。java
(1) 请求方法是如下三种方法之一: HEAD GET POST (2)HTTP的头信息不超出如下几种字段: Accept Accept-Language Content-Language Last-Event-ID Content-Type:只限于三个值application/x-www-form-urlencoded、multipart/form-data、text/plain
凡是不一样时知足上面两个条件,就属于非简单请求。python
浏览器对这两种请求的处理,是不同的。django
--简单请求: 一次请求 --非简单请求: 两次请求,在发送数据以前会先发一次请求用于作“预检”(options),只有“预检”经过后才再发送一次请求用于数据传输。 * 关于“预检” - 请求方式:OPTIONS - “预检”其实作检查,检查若是经过则容许传输数据,检查不经过则再也不发送真正想要发送的消息 - 如何“预检” => 若是复杂请求是PUT等请求,则服务端须要设置容许某请求,不然“预检”不经过 Access-Control-Request-Method => 若是复杂请求设置了请求头,则服务端须要设置容许某请求头,不然“预检”不经过 Access-Control-Request-Headers
支持跨域,简单请求json
支持跨域,复杂请求跨域
因为复杂请求时,首先会发送“预检”请求,若是“预检”成功,则发送真实数据。浏览器
在返回的结果中加入容许信息(简单请求)安全
def test(request): import json obj=HttpResponse(json.dumps({'name':'lqz'})) # obj['Access-Control-Allow-Origin']='*' 这样加入不安全 obj['Access-Control-Allow-Origin']='http://127.0.0.1:8004' return obj
放到中间件中处理简单和复杂请求:服务器
rom django.utils.deprecation import MiddlewareMixin class CorsMiddleWare(MiddlewareMixin): def process_response(self,request,response): if request.method=="OPTIONS": #能够加* response["Access-Control-Allow-Headers"]="Content-Type" response["Access-Control-Allow-Origin"] = "http://localhost:8080" return response