当前位置 : 主页 > 编程语言 > 其它开发 >

跨域的请求在服务端会不会真正执行?

来源:互联网 收集:自由互联 发布时间:2022-05-30
跨域的请求在服务端会不会真正执行? 这个问题看似简单,但是如果对跨域的理解不到位,那么大概率会答不好。 解题思路 跨域究竟是谁的策略? 在什么时机会拦截请求? 究竟什么
跨域的请求在服务端会不会真正执行?

这个问题看似简单,但是如果对跨域的理解不到位,那么大概率会答不好。

解题思路
  • 跨域究竟是谁的策略?
  • 在什么时机会拦截请求?
  • 究竟什么时候会发预检请求?
  • 如果有预检,请求什么时候会被真正执行?
跨域请求的拦截

同源策略是浏览器的策略,服务端默认是没有这种策略的。

所以请求的拦截是浏览器

在什么时候拦截

一般解决跨域问题会使用 CORS 解决,客户端会通过服务端返回的一些 Header 去判断该请求是否允许跨域

Access-Control-Allow-Origin 告诉客户端允许请求在哪些 Origin 下被发送,这些 Header 一般都是我们配在服务器上的。

所以是请求发出后,在返回来的时候被浏览器拦截

什么时候会发预检请求

一旦浏览器把请求判定为 简单请求,浏览器就不会发送预检请求了。

浏览器判定请求是否为简单请求要同时满足以下四个条件:

  1. 使用下列方法之一:
  • GET
  • HEAD
  • POST
  1. 只使用了如下的安全 Header,不得人为设置其他 Header
  • Accept
  • Accept-Language
  • Content-Language
  • Content-Type 的值仅限于下列三者之一:
    • text/plain
    • multipart/form-data
    • application/x-www-form-urlencoded
  1. 请求中的任意 XMLHttpRequest 对象均没有注册任何事件监听器;XMLHttpRequest 对象可以使用 XMLHttpRequest.upload 属性访问。
  2. 请求中没有使用 ReadableStream 对象。
总结

跨域的请求有的时候执行,有的时候不执行。
简单请求的情况下,不管是否跨域,一定会到达服务端并被执行,浏览器会隐藏返回值
复杂请求的情况下,先发预检请求,预检请求不会真正执行业务逻辑,预检请求通过后才会发送真正请求并在服务端执行

网友评论