CORS - Cross-origin resoruce sharing
1.什么是CORS
允许浏览器跨源服务器,发出XMLHttpRequest请求,克服了AJAX只能同源使用的限制。
2.特点
- 浏览器自动完成(在请求头中输入特殊头 或 发送特殊请求)
- 服务需器需要支持(响应头中需要有特殊的字段)
3.简单请求(Simple requests) 和 预检请求(Preflighted requests)
满足以下全部条件的请求 为简单请求
-
请求方法: GET , HEAD , POST
-
请求头仅包含如下内容:
Accept
Accept-Language
Content-Language
Content-Type
-
Content-Type 仅支持如下三种:
application/-www-form-urlencoded
multipart/form-data
text/plain
不满足以上任意一点的请求都是预检请求
4.简单请求发送流程
-
请求头中 携带 Origin 表明自己来自哪个域
-
响应
如果请求头中的Origin在服务器接受范围内,则返回如下头:
响应头 作用 备注 Access-Control-Allow-Origin 服务器接受的域 v Access-Control-Allow-Credentials 是否接受Cooike x Access-Control-Expose-Headers 认情况下,xhr只能拿到如下响应头:Cache-Control,Content-Language,Content-Type,Expires,Last-Modified;如果有需要获取其他头,需在此指定 x 如果服务器不接受些域,则响应头中不包含Access-Control-Allow-Origin
5,预检请求发送流程
-
OPTION请求发起,携带如下请求头:
请求头 作用 备注 Origin 表明来自哪 v Access-Control-Request-Method 主请求的方法 v Access-Control-Reqeust-Headers 此次请求使用的头 v -
OPTION响应头
响应头 作用 备注 Access-Control-Allow-Origin 同简单请求 v Access-Control-Allow-Methods 告诉浏览器,服务器接受的跨域请求方法 v Access-Control-Allow-Headers 返回所有支持的头部,当request有
‘Access-Control-Request-Headers’时,该响应头必然回复v Access-Control-Allow-Credentials 同简单请求 x Access-Control-Max-Age OPTION请求缓存时间,单位s x -
主请求阶段
请求头 作用 备注 Origin 表明此请求来自哪个域 响应头 作用 备注 Access-Control-Allow-Origin 当前服务器接受得域
Django支持
django-cors-headers官网 https://pypi.org/project/django-cors-headers/
直接pip 将把django升级到2.0以上,强烈建议用离线安装方式
配置流程
1,INSTALLED_APPS 中添加 corsheaders
2,MIDDLEWARE 中添加 corsheaders.middleware.CorsMiddleware
位置尽量靠前,官方建议 ‘django.middleware.common.CommonMiddleware’ 上方
3,CORS_ORIGIN_ALLOW_ALL 布尔值 如果为True 白名单不启用
4,CORS_ORIGIN_WHITELIST =[
"https://example.com"
]
5, CORS_ALLOW_METHODS = (
'DELETE',
'GET',
'OPTIONS',
'PATCH',
'POST',
'PUT',
)
6, CORS_ALLOW_HEADERS = (
'accept-encoding',
'authorization',
'content-type',
'dnt',
'origin',
'user-agent',
'x-csrftoken',
'x-requested-with',
)
7, CORS_PREFLIGHT_MAX_AGE 默认 86400s
8, CORS_EXPOSE_HEADERS []
9, CORS_ALLOW_CREDENTIALS 布尔值, 默认False