1 浏览器请求
浏览器将CORS请求分成两类: 1 简单请求(simple request) 2 非简单请求(not-so-simple request)
如何定义简单请求和非简单请求?
只要同时满足以下两大条件,就属于简单请求。
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
凡是不同时满足上面两个条件,就属于非简单请求
简单请求和非简单请求的区别?
1 简单请求:一次请求
2 非简单请求:两次请求,在发送数据之前会先发一次请求用于做“预检”,只有"预检"通过后才再发送一次请求用于数据传输。
什么是预检?
预检其实做检查,检查如果通过则允许传输数据,检查不通过则不再发送真正想要发送的消息。请求方式:OPTIONS
如何预检?
1 如果复杂请求是PUT等请求,则服务端需要设置允许某请求,否则预检不通过
Access-Control-Request-Method
2 如果复杂请求设置了请求头,则服务端需要设置允许某请求头,否则预检不通过
Access-Control-Request-Headers
2 django-cors-headers
1 安装 pip install django-cors-headers 2 setting中设置cors - 添加app INSTALLED_APPS = [ ‘corsheaders‘, ] - 设置中间件 MIDDLEWARE_CLASSES = [ ‘corsheaders.middleware.CorsMiddleware‘, ‘django.middleware.common.CommonMiddleware‘, ] - 设置可访问域名 CORS_ORIGIN_WHITELIST = ( ‘127.0.0.1:8080‘, ‘localhost:8080‘, ) 或 CORS_ORIGIN_ALLOW_ALL = True // 全部域名均支持跨域 - 是否支持cookie CORS_ALLOW_CREDENTIALS = False - 支持的方法 CORS_ALLOW_METHODS = ( ‘DELETE‘, ‘GET‘, ‘OPTIONS‘, ‘PATCH‘, ‘POST‘, ‘PUT‘, ‘VIEW‘, ) - 支持的头信息 CORS_ALLOW_HEADERS = ( ‘XMLHttpRequest‘, ‘X_FILENAME‘, ‘accept-encoding‘, ‘authorization‘, ‘content-type‘, ‘dnt‘, ‘origin‘, ‘user-agent‘, ‘x-csrftoken‘, ‘x-requested-with‘, ‘Pragma‘, )
- options缓存时间
CORS_ALLOW_MAX_AGE = 86400 // 默认一天时间(单位:秒)
- 自定义响应头
CORS_EXPOSE_HEADERS = []
原文:https://www.cnblogs.com/lizitestdev/p/14730023.html