1,什么是CORS
? 允许浏览器向跨源(协议 + 域名 + 端口)服务器,发出XMLHttpRequest请求,从而克服了AJAX只能同源使用的限制
2,特点
? 1,浏览器自动完成(在请求头中加入特殊头 或 发送特殊请求)
? 2,服务器需要支持(响应头中需要有特殊头)
- 跨域它分为两种请求:
- 简单请求(Simple requests)
- 预检请求(Preflighted requests)
满足以下全部条件的请求为 简单请求
? 1,请求方法如下:
? GET or HEAD or POST
? 2,请求头仅包含如下:
? Accept
? Accept-Language
? Content-Language
? Content-Type
? 3,Content-Type 仅支持如下三种:
? application/x-www-form-urlencoded
? multipart/form-data
? text/plain
? 不满足以上任意一点的请求都是 预检请求
3、简单请求发送流
1,请求
? 请求头中 携带 Origin,该字段表明自己来自哪个域
? 2,响应
? 如果请求头中的Origin在服务器接受范围内, 则返回如下头
响应头 | 作用 | 备注 |
---|
Access-Control-Allow-Origin | 服务器接受得域 | | Access-Control-Allow-Credentials | 是否接受Cooike | 可选 | Access-Control-Expose-Headers | 默认情况下,xhr只能拿到如下响应头:Cache-Control,Content-Language,Content-Type,Expires,Last-Modified;如果有需要获取其他头,需在此指定 | 可选 |
如果服务器不接受此域,则响应头中不包含 Access-Control-Allow-Origin
4,预检请求发送流程
? 1,OPTION 请求发起,携带如下请求头
请求头 | 作用 | 备注 |
---|
Origin | 表明此请求来自哪个域 | 必选 | Access-Control-Request-Method | 此次请求使用方法 | 必选 | Access-Control-Request-Headers | 此次请求使用的头 | 必选 |
2,OPTION 接受响应阶段,携带如下响应头
响应头 | 作用 | 备注 |
---|
Access-Control-Allow-Origin | 同简单请求 | 必选 | Access-Control-Allow-Methods | 告诉浏览器,服务器接受得跨域请求方法 | 必选 | Access-Control-Allow-Headers | 返回所有支持的头部,当request有 ‘Access-Control-Request-Headers’时,该响应头必然回复 | 必选 | Access-Control-Allow-Credentials | 同简单请求 | 可选 | Access-Control-Max-Age | OPTION请求缓存时间,单位s | 可选 |
3,主请求阶段
4,主请求响应阶段
响应头 | 作用 | 备注 |
---|
Access-Control-Allow-Origin | 当前服务器接受得域 | |
这里的预检请求与简单请求相比,预检请求会比简单请求多走一步,在进行cors跨域的时候,会先进行options请求,先与服务器进行商量,进行沟通,看那边是否支持跨域,会携带相应的请求头(具体看上面的表格),然后服务器会返回相应的响应头(具体以上表格),然后再进行主请求的发送响应阶段
5,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 []
#设置跨域的cookie要不要,默认不要
9, CORS_ALLOW_CREDENTIALS 布尔值, 默认False
离线安装:
1、tar -zxvf django-cors-headers-3.0.2.tar.gz
2、cd django-cors-headers-3.0.2
3、sudo python3 setup.py install
下载django-cors-headers-3.0.2.tar.gz 已上传
django-cors-headers-3.0.2.tar.gz
|