同源策略(Same origin policy)是一种约定,它规定了 请求的url地址,必须与浏览器上的url地址处于同域上,也就是域名,端口,协议相同,如果不一致,请求会发送成功,后端会正常响应,但是浏览器会拦截
浏览器对非同源请求返回的结果做了拦截,只要做前后端分离,就会产生跨域问题
CORS:跨域资源共享 ,向相应头中加数据,允许跨域
JSONP:利用有的标签没有跨域问题 比如script img
websocket:长连接,不存在跨域
前端代理:开发阶段用,上线不用
首先我们需要服务端支持----》就是服务端在相应头中加数据
CORS请求分成两类:简单请求(simple request)和非简单请求(not-so-simple request)
简单请求:只发送一次
非简单请求:发送两次,第一次是OPTIONS请求,第二次是真正的请求
只要同时满足以下两大条件,就属于简单请求。
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
凡是不同时满足上面两个条件,就属于非简单请求。
统一写一个中间件,处理所有跨域
from django.utils.deprecation import MiddlewareMixin
class CorsMiddleWare(MiddlewareMixin):
def process_response(self,request,response):
if request.method=="OPTIONS":
#可以加*
response["Access-Control-Allow-Headers"]="*"
res['Access-Control-Allow-Methods'] = '*'
response["Access-Control-Allow-Origin"] = "*"
return response
使用第三方模块
# 1、使用pip安装
pip install django-cors-headers
#2、添加到setting的app中
INSTALLED_APPS = (
...
'corsheaders',
...
)
#3、添加中间件
MIDDLEWARE = [
...
'corsheaders.middleware.CorsMiddleware',
...
]
4、setting下面添加下面的配置
CORS_ORIGIN_ALLOW_ALL = True
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',
'token'
)