美文网首页
CORS为什么要区分简单请求和非简单请求

CORS为什么要区分简单请求和非简单请求

作者: 看到这朵小fa了么 | 来源:发表于2020-03-24 19:10 被阅读0次

为什么存在跨域

首先要知道,不管是简单请求还是复杂请求,服务端每次都是要对跨域和资源进行判断的(客户端的顺滑只是服务端的伪装罢了~)。跨域只是浏览器的一种保护机制,是为了保护站点的安全,其实跨域本身是不存在的,为了安全浏览器针对XMLHTTPRequest和fetch这种脚本发起的跨域请求做了一定的跨域限制,而对于浏览器自身的如img的src、script的js资源、form表单的提交,没有做跨域的限制。

  • 简单请求:这是因为img的src、script的js只能发起get请求,而表单虽然能进行post提交,但一方面表单的提交是显式的,用户可以感知,另一方面,表单提交只能发起请求,而不能获取请求的响应,这样一来,请求可以发起,而服务端可以进行拒绝,浏览器认为这是安全的。
  • 复杂请求:通过脚本发起的跨域请求,可以对响应内容做处理,这是用户不可感知的,浏览器认为这是不安全的,所以对于复杂请求,进行跨域的限制,而CORS机制就是浏览器对跨域进行处理。对于复杂请求会发起一个预检请求,判断服务端是否可以接受这个跨域请求,接受后就可以向服务端发起真正的请求。

为什么要区分简单和非简单请求

1、因为浏览器认为简单请求是安全的,所以可以通过跨域限制到达服务器,也就没必要对简单请求做预检请求(人家本来就可以通过跨域你预检个什么)
2、当然简单请求也进行预检,不过没必要,因为预检请求是干嘛的呢你要知道。

为什么要发起预检请求

浏览器进行跨域限制主要是通过两种方式

  • 限制跨域请求的发出
  • 请求可以发出,但是响应结果会被拦截
    而浏览器免不了要进行跨域,访问资源哪有不跨域的,不跨域你只能看自己域里面的东西,所以浏览器一般是采用第二个拦截方式,而这种拦截方式,可能已经对服务端进行了数据的操作,为了防止这种情况,首先发起预检请求,来检测是否能够发起真正的请求。(这里能知道,简单请求是没必要进行预检的,因为浏览器认为,简单请求是安全的,是被用户允许的)
    预检请求预检的是url 所以即使是同源的 每个复杂请求都会进行预检 主要是对比url和方法

cors请求过程

首先如果是简单请求则在请求头直接添加orgin字段,对于非简单请求需要一次预检请求options,需要origin字段,当服务端通过预检请求会在响应头携带Allow-controll-Access-Origin字段(为*或者是origin的值),之后的请求就像简单请求一样,携带origin字段。
请求头响应头过程:https://www.jianshu.com/p/b6520a7fb386

相关文章

网友评论

      本文标题:CORS为什么要区分简单请求和非简单请求

      本文链接:https://www.haomeiwen.com/subject/pproyhtx.html