同源策略(Same origin policy)是一种约定,它规定了 请求的url地址,必须与浏览器上的url地址处于同域上,也就是域名,端口,协议相同,如果不一致,请求会发送成功,后端会正常响应,但是浏览器会拦截
跨域问题产生的原因:
浏览器对非同源请求返回的结果做了拦截,只要做前后端分离,就会产生跨域问题
解决跨域问题
CORS:跨域资源共享 ,向相应头中加数据,允许跨域
JSONP:利用有的标签没有跨域问题 比如script img
websocket:长连接,不存在跨域
前端代理:开发阶段用,上线不用
CORS如何解决跨域问题
首先我们需要服务端支持----》就是服务端在相应头中加数据
CORS基本流程
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'
)