首页 > 其他分享 >测试大姐提了个bug,为什么你多了个options请求?

测试大姐提了个bug,为什么你多了个options请求?

时间:2023-09-04 23:01:02浏览次数:42  
标签:Control 浏览器 请求 Request Accept options Access 提了 bug

1 下班前的寂静

刚准备下班呢,测试大姐又给我提个bug,你看我这就操作了一次,network里咋有两个请求?

我心一惊,”不可能啊!我代码明明就调用一次后端接口,咋可能两个请求!“。打开她的截图一看:多个options请求。

我不慌不忙解释道:”这不用管,是浏览器默认发送的一个预检请求“。

可测试大姐好像依旧很执着:“那这可肯定不行啊,明明一次请求,干嘛要两次呢,这不是增大服务端压力吗?”

“md,真固执啊,那就不下班了,加个钟给你讲懂!”

HTTP请求分为两种:

  • 简单请求
  • 非简单请求

2 简单请求

2.1 条件

  • 请求方式:HEADGETPOST

  • header中只能包含以下请求头字段:

    • Accept

    • Accept-Language

    • Content-Language

    • Content-Type所指的媒体类型值仅仅限于下列三者之一

      • text/plain
      • multipart/form-data
      • application/x-www-form-urlencoded

2.2 浏览器的不同处理方式

简单请求,若请求跨域,浏览器会放行让请求发出。浏览器会发cors请求,并携带origin。此时不管服务端返回啥,浏览器都会把返回拦截,并检查返回的responseheader中有无Access-Control-Allow-Origin

  • 这头部信息的值通常为请求的Origin值,表示允许该来源的请求说明资源是共享的,可以拿到
  • 如果Origin头部信息的值为"*"(表示允许来自任何来源的请求)但这种情况下需要谨慎使用,因为它存在安全隐患
  • 如没有这个头信息,说明服务端没有开启资源共享,浏览器会认为这次请求失败终止这次请求,并且报错。

3 非简单请求

只要不满足简单请求的条件,都是非简单请求。

发出非简单cors请求,浏览器会做一个http的查询请求(预检请求)即optionsoptions请求会按照简单请求来处理。

为啥要做一次options请求?

检查服务器是否支持跨域请求,并确认实际请求的安全性。预检请求是为保护客户端的安全,防止不受信任网站利用用户浏览器向其他网站发恶意请求。 预检请求头中除了携带了origin字段还包含两个特殊字段:

  • Access-Control-Request-Method: 告知服务器实际请求使用的HTTP方法

  • Access-Control-Request-Headers:告知服务器实际请求所携带的自定义首部字段

如:

OPTIONS /resources/post-here/ HTTP/1.1
Host: bar.other
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Connection: keep-alive
Origin: http://foo.example
Access-Control-Request-Method: POST
Access-Control-Request-Headers: X-PINGOTHER, Content-Type

以上报文中就可以看到,使用OPTIONS请求,浏览器根据上面的使用的请求参数来决定是否需要发送,这样服务器就可以回应是否可以接受用实际的请求参数来发送请求。

-Access-Control-Request-Method告知服务器,实际请求将使用 POST 方法

Access-Control-Request-Headers告知服务器,实际请求将携带两个自定义请求标头字段:X-PINGOTHERContent-Type。服务器据此决定,该实际请求是否被允许。

啥时触发预检请求?

  1. 发送跨域请求时,请求头中包含了一些非简单请求的头信息,如自定义头(custom header)
  2. 发送跨域请求时,使用了 PUT、DELETE、CONNECT、OPTIONS、TRACE、PATCH等请求方法

“大姐你听懂了吗?所以这不是 bug,赶紧把它关掉吧!”

大姐漏出了澄澈的目光,好吧

4 上案例

这下测试大姐终于半信半疑地关闭了Bug。

5 假如世上没有测试大姐

我说假如啊!你的测试老大姐就是说:我不懂你说的这些,我不管,反正我现在想看到的是在浏览器里面只有一次网络请求,你自己看着办吧,bug 我留在这了,你自己处理!

爱!浏览器厂商为了保证安全性,禁止了跨域,可最终还是程序员承受了所有优化的代价!

本文由博客一文多发平台 OpenWrite 发布!

标签:Control,浏览器,请求,Request,Accept,options,Access,提了,bug
From: https://blog.51cto.com/JavaEdge/7365035

相关文章

  • 测试大姐提了个bug,为什么你多了个options请求?
    1下班前的寂静刚准备下班呢,测试大姐又给我提个bug,你看我这就操作了一次,network里咋有两个请求?我心一惊,”不可能啊!我代码明明就调用一次后端接口,咋可能两个请求!“。打开她的截图一看:多个options请求。我不慌不忙解释道:”这不用管,是浏览器默认发送的一个预检请求“。可测试大姐好像......
  • antd的一个bug
    1、 菜单长成这样 事实上我们要菜单这样 目前antd实现不了,很不友好的东西 ......
  • Windows下平台release debug下内存释放的差异
    今天遇到了这个问题,代码如下: inttest1(int*n,int**constbodys){   if(n==nullptr||bodys==nullptr)   {      return-1;   }   *n=3;   std::vector<int>nums={1,2,3};   *bodys=&nums[0];   return0;}intmain(voi......
  • fastadmin xdebug调试
    1、配置一个phpinfo.php文件;2、安装xdebug插件打开https://xdebug.org/wizard,将phpinfo.php源代码,复制到文本输入框,xdebug会分析出php环境配置,然后按照说明安装即可。注意:端口最好不要用9000,不然会跟Nginx冲突3、修改vscode配置文件---->首选项---->设置,点击:在settings.json......
  • 包,内部类,debug调试
    -记住:java中所有的类,都直接或者间接继承Object类Object类是所有类的跟类。classAextendsObject{}classBextendsA{}packagecom.momo.test;publicclassDemo8{publicstaticvoidmain(String[]args){//接口多态Interi=newInterImp();/*System.out.println(i.a);......
  • phpstorm 2023 配置 xdebug
    一、安装xdebug下载Xdebug,要下载与PHP对应版本的Xdebugxdebug官网下载地址:Xdebug:Downloads这里下载的如果没有跟你的php对应,那么等待你的就是一堆报错网站提供了一个自动分析系统对应的xdebug版本,网址是:Xdebug:Support—TailoredInstallationInstructions在页面中......
  • ShowMeBug X 得物APP | 精准识别技术人才,高效搭建潮流电商团队
    ShowMeBug签约了新一代潮流网购社区——得物APP,并在技术的赋能下,为得物APP提供了有效的技术人才招聘解决方案,帮助企业快速识别优质技术人才,精准评估技术人才实力。得物APP通过ShowMeBug 技术测评环节的智能组卷和自动评卷功能,HR高效完成对技术候选人的初步筛选,为技术面试官节......
  • 字节青训营 x ShowMeBug:项目实战,弥补学用鸿沟
    近期,ShowMeBug与字节青训营联合举办针对技术人群的培训实践活动,该活动目前正如火如荼地进行中,并即将迎来尾声。  这是一次理念相契的合作。字节青训营是稀土掘金社区发起的技术培训和人才选拔项目,面向在校大学生,旨在培养优秀且具有职业竞争力的开发工程师。在传统的教育视......
  • Bugku-web34(文件包含)
    一:学到了一个挺有意思的文件包含代码::<scriptlanguage=php>system("find/-nameflag*");</script>二:文件上传的方式;菜刀连接;;<scriptlanguage="php">phpinfo();@eval($_POST['flag']);</script>......
  • Bugku-web35(序列化)
    访问css样式之后得到提示:扒下代码::<?phperror_reporting(0);$KEY='ctf.bugku.com';include_once("flag.php");$cookie = $_COOKIE['BUGKU'];if(isset($_GET['20260'])){    show_source(__FILE__);}elseif (unserialize($cookie) ......