偶然发现的简单请求,复杂请求

227 阅读2分钟

前言

在做前后端分离项目的时候,发送跨域请求时会发送两个请求,第一个请求为option请求,第二个才是我想要发送的请求。简单了解过后知道这是跨域独有的知识点。

为什么会有两个请求?

原因也非常简单,这是浏览器自动添加的预检机制。这里不讨论浏览器跨域问题,只说这第一个option请求都干了什么。

简单请求

当请求不满足下述任一条件时,即为简单请求

1、使用了下面任一 HTTP 方法:

PUT DELETE CONNECT OPTIONS TRACE PATCH

2、人为设置了对 CORS 安全的首部字段集合之外的其他首部字段。该集合为:

  • Accept
  • Accept-Language
  • Content-Language
  • Content-Type (application/x-www-form-urlencoded | multipart/form-data | text/plain)
  • DPR
  • Downlink
  • Save-Data
  • Viewport-Width
  • Width

对于简单请求,浏览器并不会做过多处理,只是会在请求中需要额外添加一个 Origin 的头部,其中包含请求页面的源信息(协议、域名和端口),以便服务器根据这个头部信息来决定是否给予响应。例如:Origin: http://www.tx.com

如果服务器认为这个请求可以接受,就在Access-Control-Allow-Origin头部中回发相同的源信息(如果是公共资源,可以回发*)。例如:Access-Control-Allow-Origin: http://www.tx.com

没有这个头部或者有这个头部但是源信息不匹配,浏览器就会驳回请求。正常请求下,浏览器会处理请求。注意,请求和响应都不包含cookie信息。

如果需要包含cookie信息,ajax请求需要设置xhr的属性withCredentialstrue,服务器需要设置响应头部Access-Control-Allow-Credentials: true

复杂请求

什么是复杂请求?除了简单请求以外都是复杂请求。

对于复杂请求,浏览器会先发送一个option请求用于检验,这个请求会带有如下请求头

  • Origin: www.tx.com

  • Access-Control-Request-Method – 请求种类(get/post/delete等)

  • Access-Control-Request-Headers – 除开上面列举的请求头以外的特殊请求头

之后服务端会返回信息,其中响应头中包含以下信息

  • Access-Control-Allow-Origin – 和简单请求一样

  • Access-Control-Allow-Methods – 这是对预请求当中Access-Control-Request-Method的回复,这一回复将是一个以逗号分隔的列表。尽管客户端或许只请求某一方法,但服务端仍然可以返回所有允许的方法,以便客户端将其缓存。

  • Access-Control-Allow-Headers – 这是对预请求当中Access-Control-Request-Headers的回复

  • Access-Control-Max-Age(可选) – 以秒为单位的缓存时间。

最后

这就算是个小知识点吧,挺基础的0.0