前言

去年这个时候有写过一篇文章叫

浏览器将cors请求分为两类,简单请求和非简单请求,阮一峰在

如第一张图的执行流程,会在请求头增加Origin字段为"http ://localhost"到后端,后端去检测Origin信息,此时检查的请求头部有没有自定义的,那么问题来了。
1、为毛要再次检查请求头?因为你前端信息为不可信信息,别人可以伪造浏览器请求加入Origin信息,并且自定义请求头。
2、自定义请求头有哪些定义有哪些?

  • Accept:用来告知(服务器)客户端可以处理的内容类型
  • Accept-Language:允许客户端声明它可以理解的自然语言,以及优先选择的区域方言
  • Content-Language:是一个 entity header (实体消息首部),用来说明访问者希望采用的语言或语言组合,这样的话用户就可以根据自己偏好的语言来定制不同的内容
  • Content-Type实体头部用于指示资源的MIME类型 media type(不属于简单请求的三个的任何一个)
  • DPR
  • Downlink
  • Save-Data
  • Viewport-Width
  • Width

他调这个接口的时候并没有自定义头部,只有设置了Content-Type为application/x-www-form-urlencoded,但是这并不影响,所以现在到了判断是否符合要求的位置,什么符合要求呢?但是当然是跨源资源共享验证,但是他后台并没有配置任何的跨域访问,所以所有的跨域请求多会被拒绝门外,但是信息是正常返回的,只不过返回头里面没有加Access-Control-Allow-Origin这个字段,如图一所示。
这是时候会发生什么情况呢?截两张图就知道了。

what?
浏览器确实收到消息,但是他就是不给你,并且告诉你,你小子跨域了,并且服务器不同意你的跨域请求,所以就直接抛一个错误给你,你自己看着办吧!

非简单请求步骤就多了一步

在不满足简单请求的情况之下(就是非简单请求),此时,如图一所示,并不直接发送请求,而是发送一个OPTIONS预检请求(所以下次看到OPTIONS请求的时候就知道这其实是一个前菜,好戏在后头呢。嘻嘻),后台也是去做一个跨源资源共享验证,他这里没有配置,当然不成功,所以还是正常返回,这次返回头里不仅不给返回Access-Control-Allow-Origin,而且不会有任何响应主体(如果你不配置的话),这也就是为啥后来他胡乱配置一通后发现post请求竟然变成OPTIONS请求了,然后不传数据还不给返回数据的原因。请求视图如下:

(细心了小伙伴会发现多了两个字段,一看就明白,不用解释了。嘻嘻)

怕他看不懂,所以这里也用一个小故事稍微解析一下子

首先来建立三个角色,小明(请求代码,也可以说是开发者)、课代表(浏览器)、老师(服务器)

  • 简单请求:
    小明(请求代码)做了一份试卷(请求包)交给课代表(浏览器),课代表分析得出,这是一份简单试卷(简单请求),然后写上这是这是一班的试卷(加上Origin字段),并且告诉老师这是一份简单试卷,老师(服务器)拿到试卷后,就开始阅读。
    首先看这个题(请求头部),是不是简单的试卷,毕竟课代表说的话不可信。
    如果不简单就直接丢了,如果是简单试卷就再看看课代表写的是几班的试卷。
    老师说我只改一班和三班的试卷(跨源资源共享验证),刚好这是一班的试卷,所以就改完直接还给课代表了,课代表发现没有异样就直接给小明了。
    如果这不巧是二班的试卷,老师还是把试卷给改出来(服务器返回正常的结果),但是同时在试卷上加上一句话,“我是一班和三班的老师,以后不要发二班的试卷给我了(返回头中没有Access-Control-Allow-Origin字段)”。
    课代表大发雷霆,不仅不把试卷(服务器正常结果)给小明,还警告小明(抛出错误)。

  • 非简答请求:
    小明(请求代码)做了一份试卷(请求包)交给课代表(浏览器),课代表分析得出,这是一份很难的试卷(非简单请求),然后课代表写一封信(OPTIONS请求,里面写上这是一班的试卷)给老师。
    老师收到这封信,老师改一班和三班的试卷,所以就批改这封信(后台设置返回的信息,不设置是没有返回主体的),ok,没问题,请把试卷给我(返回头中有Access-Control-Allow-Origin字段)。
    然后课代表发现信没有异样,后面的流程就像批改简单试卷流程一样了。
    如果,课代表发送的信里写这的是“这是二班的试卷”,那么,老师还是会批改这封信,然后正常返回这封信。关键是老师又加上那句话“我是一班和三班的老师,以后不要发二班的试卷给我了(返回头中没有Access-Control-Allow-Origin字段)”,所以,试卷根本就没有发给老师。

  • 注意
    简单请求是只有一次请求的,非简单请求是两次请求。然后一切都透彻了啊!

看懂了朋友请给个赞呀!

没看懂的请多看几遍,然后再实操几遍,毕竟我的一位朋友说过:“看别人单手做引体向上很容易,有本事你试试?”

本来就是明白的大佬请留个言,让我关注一波膜拜一下子呗。(= ̄ω ̄=)

对了,每一篇都是原创,转载记得注明出处就好了!https://www.cnblogs.com/Juaoie/p/11692819.html