首页 文章 精选 留言 我的

精选列表

搜索[cors],共554篇文章
优秀的个人博客,低调大师

OPTIONS 方法在跨域请求(CORS)中的应用

OPTIONS 方法比较少见,该方法用于请求服务器告知其支持哪些其他的功能和方法。通过 OPTIONS 方法,可以询问服务器具体支持哪些方法,或者服务器会使用什么样的方法来处理一些特殊资源。可以说这是一个探测性的方法,客户端通过该方法可以在不访问服务器上实际资源的情况下就知道处理该资源的最优方式。 既然比较少见,什么情况下会使用这个方法呢? 最近在做跨域文件上传的时候,浏览器会自动发起一个 OPTIONS 方法到服务器。 如果只是普通的 ajax 请求,也不会发起这个请求,只有当 ajax 请求绑定了 upload 的事件并且跨域的时候,就会自动发起这个请求。 var xhr = new XMLHttpRequest(); var url = 'http://api.xxx.com/upload'; xhr.open('POST', url); xhr.upload.addEventListener('progress', function (){ // ... }, false); xhr.upload.addEventListener('load', function (){ // ... }, false); xhr.upload.addEventListener('error', function (){ // ... }, false); xhr.upload.addEventListener('abort',function (){ // ... }, false); xhr.send(data); 上面的代码是在 xxx.com 域下发起了一个跨域的 POST 请求,期望提交数据到 api.xxx.com 这个域名的服务器,同时在提交数据的时候希望能监测到文件上传的实时进度。 自动发起的 OPTIONS 请求,其请求头包含了的一些关键性字段: OPTIONS /upload HTTP/1.1 Access-Control-Request-Method: POST Access-Control-Request-Headers: accept, content-type Origin: http://xxx.com ... 在这种场景下,客户端发起的这个 OPTIONS 可以说是一个“预请求”,用于探测后续真正需要发起的跨域 POST 请求对于服务器来说是否是安全可接受的,因为跨域提交数据对于服务器来说可能存在很大的安全问题。 请求头 Access-Control-Request-Method 用于提醒服务器在接下来的请求中将会使用什么样的方法来发起请求。 那么在服务端应该如何处理这个 OPTIONS 请求呢? 这里以 node.js 服务器的 Koa 框架为例。在服务端会增加一个 OPTIONS 方法的 /upload 路由来处理客户端的这个请求。 Koa 中使用了一个比较受欢迎的koa-router中间件来处理路由,但是该中间件对 OPTIONS 方法默认的处理方式会有点问题。因为在响应上面的 OPTIONS 请求时,需要添加上用于访问控制的响应头。 响应头中关键性的字段: Access-Control-Allow-Method: POST Access-Control-Allow-Origin: http://xxx.com Access-Control-Allow-Method 和 Access-Control-Allow-Origin 分别告知客户端,服务器允许客户端用于跨域的方法和域名。 node.js 的路由代码会是这样的: router.options('/upload', function* (){ this.set('Access-Control-Allow-Method', 'POST'); this.set('Access-Control-Allow-Origin', 'http://xxx.com'); this.status = 204; }); 上面倒数第二行的代码也很重要,设置响应状态码为 204 是为了告知客户端表示该响应成功了,但是该响应并没有返回任何响应体,如果状态码为 200,还得携带多余的响应体,在这种场景下是完全多余的,只会浪费流量。 关于 204 状态码的意义我经常会在面试的时候问起,这里就是一个实际应用的例子 ^_^ 好了,OPTIONS 的请求处理完了,剩下的 POST 请求就简单了,只需在响应头中添加一条和 OPTIONS 一致的允许跨域的域名即可,这里就不重复粘贴代码了。

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册