1. 跨域
跨域:出于浏览器的同源策略限制,协议(protocol),主机(host)和端口号(port)有任一不同时,就会出现跨域问题 跨域请求分类(简单请求,复杂请求):
简单请求(同时满足以下三个条件)
1. 请求方式必须为get,head,post
2. 请求头仅包含:accept,accept-language,content-language,content-type
3. content-type仅支持以下三种:application/x-www-form-urlencoded,multipart/form-data,text/plain
复杂请求:
不是简单请求的请求
简单请求的流程:
简单请求的请求头中会自带origin,表名自己来自于哪个域
响应会带有access-control-allow-origin的响应头,表名后端接收的域
复杂请求(预检请求)的流程:
1. 先发一个options请求,携带origin,access-control-request-method,access-control-request-headers请求头
2. 服务器处理请求,返回access-control-allow-origin,access-control-request-method,access-control-request-headers响应头
3. 浏览器再次发送真实请求
备注:预检请求会发送两次请求,会增大服务器的压力,所以在options预检请求的时候,服务器会返回一个access-control-max-age的响应头,
返回一个有效时间(一般一天),浏览器在有效期期间再次请求时不必再发options请求,直接发送真实请求即可。
解决方法 1. jsonp 只能发送get请求,不使用 2. cors 跨域资源共享
3. nginx反向代理
2. django的cors解决跨域
1. installed_app中添加corsheaders 2. middleware中添加'corsheaders.middleware.CorsMiddleware' 位置尽量靠前,官方建议放在'django.middleware.common.CommonMiddleware'之前 3. CORS_ORIGIN_ALLOW_ALL值为True时,白名单不启用,所有域名均可访问 4. CORS_ORIGIN_WHITELIST 白名单启用,是个列表或元组 5. CORS_ALLOW_METHODS 允许的请求方式 6. CORS_PREFLIGHT_MAX_AGE 在多少时间内,不用预检请求,默认86400s,即一天
CORS_ALLOW_METHODS = ( 'DELETE', 'GET', 'OPTIONS', 'PATCH', 'POST', 'PUT', 'VIEW', ) CORS_ALLOW_HEADERS = ( 'accept', 'accept-encoding', 'authorization', 'content-type', 'dnt', 'origin', 'user-agent', 'x-csrftoken', 'x-requested-with', )