CORS需要浏览器和服务器同时支持。目前,所有浏览器都支持该功能,IE浏览器不能低于IE10。
整个CORS通信过程,都是浏览器自动完成,不需要用户参与。对于开发者来说,CORS通信与同源的AJAX通信没有差别,代码完全一样。浏览器一旦发现AJAX请求跨源,就会自动添加一些附加的头信息,有时还会多出一次附加的请求,但用户不会有感觉。
因此,实现CORS通信的关键是服务器。只要服务器实现了CORS接口,就可以跨源通信。
(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
凡是不同时满足上面两个条件,就属于非简单请求。
浏览器对这两种请求的处理,是不一样的。
- 请求方式:OPTIONS - “预检”其实做检查,检查如果通过则允许传输数据,检查不通过则不再发送真正想要发送的消息 - 如何“预检” => 如果复杂请求是PUT等请求,则服务端需要设置允许某请求,否则“预检”不通过 Access-Control-Request-Method => 如果复杂请求设置了请求头,则服务端需要设置允许某请求头,否则“预检”不通过 Access-Control-Request-Headers
服务器设置响应头:Access-Control-Allow-Origin = ‘域名‘ 或 ‘*‘
由于复杂请求时,首先会发送“预检”请求,如果“预检”成功,则发送真实数据。
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
from django.utils.deprecation import MiddlewareMixin
class MyCorsMiddle(MiddlewareMixin): def process_response(self, request, response): # 简单请求: # 允许http://127.0.0.1:8001域向我发请求 # ret[‘Access-Control-Allow-Origin‘]=‘http://127.0.0.1:8001‘ # 允许所有人向我发请求 response[‘Access-Control-Allow-Origin‘] = ‘*‘ if request.method == ‘OPTIONS‘: # 所有的头信息都允许 response[‘Access-Control-Allow-Headers‘] = ‘*‘ return response
在settings中配置即可,在中间件中的位置可以随意放置.
原文:https://www.cnblogs.com/zhaijihai/p/10158415.html