为啥有时候会发两次呢?(预检请求)

这其实跟浏览器的“预检”机制有关系。简单来说,就是浏览器在正式发请求之前,会先问问服务器:“嘿,我要发请求了,你准备好了吗?能接收吗?”这个过程就叫做“预检请求”,也叫OPTIONS请求。

为啥要有这个预检呢?

因为有时候咱们发的请求可能比较复杂,比如请求头里面带了点特殊的东西,或者请求方法是PUT、DELETE这种不常用的。这时候,浏览器就会有点担心,怕服务器不理解或者不接受这个请求,所以就先发个简单的OPTIONS请求去问问。
如果服务器说:“没问题,你来吧!”那浏览器就会再发一次正式的POST请求。所以,咱们就看到了两次请求:一次是预检的OPTIONS请求,一次是正式的POST请求。

那么,跨域请求的时候,什么情况下会发出OPTIONS预检请求呢?

  1. 请求方法不是GET、HEAD、POST:因为GET、HEAD、POST这三种方法被认为是“简单”的,通常不会对服务器造成太大影响,所以浏览器会直接发送请求。但如果是PUT、DELETE等方法,浏览器就会先发个OPTIONS请求问问,就怕有人要搞破坏。

  2. 请求头包含了自定义字段:比如你在请求头里加了个X-Token,浏览器就会觉得:“咦,这个请求头看起来不简单,我得先问问服务器同不同意。”

  3. Content-Type不是常见的三种类型:常见的Content-Type有application/x-www-form-urlencoded、multipart/form-data和text/plain。如果你用了其他类型,比如application/json,浏览器也会先发个OPTIONS请求。

总结

  1. 浏览器的同源策略:简单来说,就是浏览器为了安全起见,设置的一个规矩。这个规矩规定,来自不同源的网页之间不能直接进行交互。这里的“源”指的是协议(比如http或https)、域名(比如www.example.com)和端口号(比如80或443)这三者的组合。只要这三者中有任何一个不同,就认为是不同的源。

  2. CORS:全称是跨域资源共享(Cross-Origin Resource Sharing),是浏览器和服务器之间的一种约定,用来解决跨域请求的问题。简单来说,CORS就是一种机制,让服务器告诉浏览器:“嘿,这个网页虽然来自不同的源,但它是安全的,你可以让它访问我的资源。”