浏览器的同源策略和跨域详解(内含故事解析) 前言
前言
浏览器将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