django 结合 OPTIONS方法 处理跨域请求(单个视图方法中)
OPTIONS 方法比较少见,该方法用于请求服务器告知其支持哪些其他的功能和方法。通过 OPTIONS 方法,可以询问服务器具体支持哪些方法,或者服务器会使用什么样的方法来处理一些特殊资源。可以说这是一个探测性的方法,客户端通过该方法可以在不访问服务器上实际资源的情况下就知道处理该资源的最优方式。
既然比较少见,什么情况下会使用这个方法呢?
假设在 edx.open.com 域下发起了一个跨域的 POST 请求,期望提交数据到 api.sit.com 这个域名的服务器。
在进行发送POST请求前,会自动先发起一个 OPTIONS 请求,其请求头包含了的一些关键性字段:
OPTIONS /upload/ HTTP/1.1
Access-Control-Request-Method: POST
Access-Control-Request-Headers: accept, content-type
Origin: http://edx.open.com
...
这种场景下,客户端发起的这个 OPTIONS 可以说是一个“预请求”,用于探测后续真正需要发起的跨域 POST 请求对于服务器来说是否是安全可接受的,因为跨域提交数据对于服务器来说可能存在很大的安全问题。
请求头 Access-Control-Request-Method 用于提醒服务器在接下来的请求中将会使用什么样的方法来发起请求。
那么在服务端应该如何处理这个 OPTIONS 请求呢?
响应上面的 OPTIONS 请求时,需要添加上用于访问控制的响应头。
响应头中关键性的字段:
Access-Control-Allow-Method: POST
Access-Control-Allow-Origin: http://edx.open.com
3 Access-Control-Allow-Headers: X-CSRFToken, Content-Type
Access-Control-Allow-Method 和 Access-Control-Allow-Origin 分别告知客户端,服务器允许客户端用于跨域的方法和域名。
完整处理流程如下:
一.在视图(我定义的是类视图)中定义OPTIONS方法: def options(self, request, *args, **kwargs)/获取请求头的 Access-Control-Request-Method 和 Origin 参数
method = request.META.get('Access-Control-Allow-Method')
2 origin = request.META.get('Origin')
二.在def options(self, request, *args, **kwargs) 方法中 设置响应头信息,返回response对象
response = Response()
response['Access-Control-Allow-Method'] = method # 支持那些请求方法,可以根据实际情况配置如 "POST, GET ,OPTIONS"
response['Access-Control-Allow-Origin'] = origin # 实际操作中本人无法获取请求头中的Origin参数,所以这里我实际上是配置成了 "*",但是不建议这样操作,后续会有问题,可以根据实际情况写成固定的也可以 "完整域名"
4 response["Access-Control-Allow-Headers"] = "X-CSRFToken, Content-Type" # 如果配置接收的请求头有遗漏,当发送OPTIONS方法成功后,发送正式请求时将会在浏览器报错,可以根据浏览器中consolo的报错内容添加进去即可, 我这里需要配置的就是这两个
5 return response # OPTION方法定义完成后,还需要在正式的视图方法中的响应对象中配置一样的响应头信息,这里不再重复了,至此,该视图方法就支持跨域请求了。
# 需要留意的是,jquery发送OPTIONS请求时,默认将不会携带cookie信息,如果此时该视图需要进行登录验证(跨域请求,却要进行用户验证,这样的场景往往存在于支持单点登录功能的多个联合平台中,如天猫和淘宝), 这时就需要在发送请求时在请求头中进行相应的配置,具体这里就不细说了,想要了解 请点击这里
# 但是我参照这种方式进行配置,options请求方法返回的都是403,所以我的处理方式是在接口(使用drf插件进行接口开发,使用drf的验证功能https://www.cnblogs.com/lowmanisbusy/p/8969771.html)注明允许所有用户访问,其实就相当于不进行登录验证,允许匿名用户进行访问(笔者所进行开发的项目如果不进行设置允许用户以何种身份方式进行访问,就会抛出异常),然后让前端传递一个用户名称给我,再使用这个数据到用户表查询自己想要的用户数据,实现功能
注意:
这里的OPTION方法中应该设置响应状态码为 204 是为了告知客户端表示该响应成功了,但是该响应并没有返回任何响应体,如果状态码为 200,还得携带多余的响应体,在这种场景下是完全多余的,只会浪费流量。
三.这里只是实现了单个视图支持跨域请求,要实现全局支持跨域请求请点击: https://www.cnblogs.com/lowmanisbusy/p/9589432.html
django 结合 OPTIONS方法 处理跨域请求(单个视图方法中)的更多相关文章
- JSONP方法解决跨域请求
Ajax跨域请求的问题 跨域:跨域名, 一个域名下的文件去请求了和他不一样的域名下的资源文件(注意是请求文件,而不是数据接口),那么就会产生跨域请求,下面来写一个ajax来跨域请求的例子 <!D ...
- ThinkPHP 5 中AJAX跨域请求头设置方法
最近用thinkphp做项目,在测试环境时,存在接口的测试问题.在tp官网也没能找到相关的解决方法.自已看了一下源码,有如下的解决方案. 在项目目录下面,创建common/behavior/CronR ...
- jQuery ajax跨域请求的解决方法
在Ajax应用中,jQuery的Ajax请求是非常容易而且方便的,但是初学者经常会犯一个错误,那就是Ajax请求的url不是本地或者同一个服务器下面的URI,最后导致虽然请求200,但是不会返回任何数 ...
- Jquery DataTable AJAX跨域请求的解决方法及SSM框架下服务器端返回JSON格式数据的解决方法
如题,用HBuilder开发APP,涉及到用AJAX跨域请求后台数据,刚接触,费了不少时间.幸得高手指点,得以解决. APP需要用TABLE来显示数据,因此采用了JQ 的DataTable. 在实现 ...
- ajax本地跨域请求以及解决方法
什么是跨域? 我们通常所说的跨域是狭义的,是由浏览器同源策略限制的一类请求场景.所谓同源是指"协议+域名+端口"三者相同,即便两个不同的域名指向同一个ip地址,也非同源,只要没 ...
- IE9 下面, XMLHttpRequest 是不支持跨域请求的解决方法
在 IE9 下面, XMLHttpRequest 是不支持跨域请求的. IE10 的 XMLHttpRequest 支持跨域, 而 IE8, IE9 需要使用 XDomainRequest 来实现跨域 ...
- 关于vue-resource 跨域请求的异常处理方法
当你启动一个vue项目时,项目会运行在一个webpack的服务上,所以此时去访问其他端口或者是其他地址时,属于跨域请求,故会报异常. has been blocked by CORS policy: ...
- Thinkphp5.1允许uni-app的H5跨域请求接口解决方法
情景: uni-app使用vue框架开发混合APP,虽然APP或者小程序没有跨域,但希望就是写完这个既有H5,又有APP,小程序等,所以能通过后端解决跨域最好.但是不知道是vue的原因还是什么,在PH ...
- thinkphp封装方法添加跨域请求
function wang_json($data){ //返回JSON数据格式到客户端,包含状态信息 header(' Content-Type:application/json; charset=u ...
随机推荐
- my sql存储过程 基本使用
--------------创建不带参数的存储过程----------------- DELIMITER;; drop PROCEDURE if EXISTS selectStudent; creat ...
- Tomcat域名映射和端口设置
1.打开tomcat主目录 ---> 打开conf目录 ---> 找到并打开server.xml文件 2.修改tomcat的监听端口为80端口 在文件中找到: <Connecto ...
- SpringAop及拦截器
一.Aop Aop,面向切面编程,提供了一种机制,在执行业务前后执行另外的代码. 切面编程包括切面(Aspect),连接点(Joinpoint).通知(Advice).切入点(Pointcut).引入 ...
- 22.Generate Parentheses (String; Back-Track)
Given n pairs of parentheses, write a function to generate all combinations of well-formed parenthes ...
- java文档打包成压缩包并且下载
需求,根据产品ID查询产品详情,产品详情会返回产品的一些文案,以及图片的url.需要做成,将文案信息记录在一个txt文档中,然后图片下载到文件夹,最后下载到本地,下载后自动删除刚才生成的文件夹以及文件 ...
- jquery中的属性和样式设置
添加属性 $target.attr({"title":"one piece","name":"solgan"}); 为目 ...
- linux环境下pdo加载问题
报错信息信息 PHP Warning: PHP Startup: Unable to load dynamic library ‘/usr/lib/php5/20121212/pdo_mysql.so ...
- kaggle-泰坦尼克号Titanic-1
大家都熟悉的『Jack and Rose』的故事,豪华游艇倒了,大家都惊恐逃生,可是救生艇的数量有限,无法人人都有,副船长发话了『lady and kid first!』,所以是否获救其实并非随机,而 ...
- CoreDNS for kubernetes Service Discovery
一.CoreDNS简介 Kubernetes包括用于服务发现的DNS服务器Kube-DNS. 该DNS服务器利用SkyDNS的库来为Kubernetes pod和服务提供DNS请求.SkyDNS2的作 ...
- Silverlight与JavaScript的交互操作
Silverlight和JavaScript交互介绍以及简单Demo演示,主要包括JavaScript操作Silverlight数据.Silverlight操作JavaScript数据以及数据模版绑定 ...