Django 跨域访问POST请求需预先发送option请求问题处理方案
跨域访问POST请求需预先发送option请求问题处理方案
By:授客 QQ:103355122
实践环境
Win 10
Python 3.5.4
Django-2.0.13.tar.gz
官方下载地址:
https://www.djangoproject.com/download/2.0.13/tarball/
问题描述
使用POST请求访问Django后端API时自动先发送option请求,然后才执行POST请求
原因分析
跨域资源共享(CORS)机制导致。
浏览器将CORS请求分成两类:简单请求(simple request)和非简单请求(not-so-simple request)。
只要同时满足以下两大条件,就属于简单请求,否则就是非简单请求。
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)
当请求存在跨域资源共享(CORS),并且是非简单请求,就会触发CORS的预检请求(preflight);"预检"请求用的请求方法是OPTIONS,如果请求OK,才会再次发送目标操作请求。
实际开发过程中,后台采用token检验机制,前台发送请求必须将token放到Request Header中,那么就需要传输自定义Header信息、或则请求头中的Content-Type设置为"application/json",就会形成非简单请求。 但是很多时候,我们并不希望浏览器这么做,重复的请求,一方面是增加服务器压力,另一方面,相当于增加了请求响应时间。
解决方法
一种比较合适的解决方法就是增加响应头“Access-Control-Max-Age”来控制浏览器在多长时间内(单位为秒)无需在请求时发送预检请求,从而减少不必要的预检请求。
中间件代码如下:
#!/usr/bin/env python # -*- coding:utf-8 -*- __author__ = '授客' from django.utils.deprecation import MiddlewareMixin class PublicAccessControlMiddleware(MiddlewareMixin): def process_request(self, request): pass def process_response(self, request, response): response['Access-Control-Max-Age'] = 86400 #3600*24h = 86400秒,即告诉浏览器,缓存预检结果24小时,即针对同一URL请求,发送第一个OPTION请求往后24小时内不再发送OPTION请求。 return response
参考链接
https://juejin.im/post/5c889e136fb9a049d37ff768
- 解决jquery ajax在跨域访问post请求的时候,ie9以下无效(包括ie9)的问题
- java 发送post,get请求及空格问题处理
- linux shell中curl 发送post请求json格式问题的处理方法
- spring mvc 访问不同的目录下的jsp视图及处理POST请求参数中文乱码问题
- GET、POST请求处理中文问题(用HttpURLConnection模拟发送请求)
- 解决jquery ajax在跨域访问post请求的时候,ie9以下无效(包括ie9)的问题
- express框架使用axios进行post请求跨域问题,以及返回的数据是undefined的问题
- vue 集成 axios 发送post请求 payload导致后台无法接收到数据问题
- vue开发:VUE axios发送跨域请求需要注意的问题
- java 发送post请求参数中含有+会转化为空格的问题
- django框架下用ajax发送post请求403forbidden解决方法
- django解决跨域请求的问题
- Django Ajax跨域问题解决方案
- VUE axios发送跨域请求需要注意的问题
- jQuery 跨域请求问题和xml文件中带有命名空间的元素的访问
- Tomcat在处理GET和POST请求时产生的乱码问题
- Nginx环境JS向PHP发送多个url请求跨域问题
- mysql远程访问 sql删除记录 伪造浏览器post php错误处理学习 django模板改tdk
- vue-cli axios请求方式及跨域处理问题
- 跨域访问-预请求及跨域常见问题