跨域请求从发送到被拦截的过程?

面试时被问到这个问题。

我的回答是浏览器接受到服务器的响应后,会检查当前源是否在Access-Control-Allow-Origin字段内,或者这个字段是不是*号。如果两个条件都不满足就给拦截掉。虽然是收到了响应,但不做之后的处理。

但是面试官说是错的,让我在仔细看看。

我百度了一圈,没有发现其他的说法

请问跨域请求从发送到被拦截的详细过程??

阅读 4.3k
1 个回答

emmm...面试结束之后其实你可以当场就直接问面试官的。

核心说出来了,但细节有些问题。但也不能说是错,只是没答全。

第一个问题是浏览器发现 AJAX 是跨域请求后,会先发一个谓词为 OPTIONS 的请求给服务器,这个请求叫“预检请求”(Preflighted);预检通过后才会二次发送原本真正的请求。关键词是有两个请求,这点你要答出。

注:并非所有跨域 AJAX 请求都一定会有预检请求,哪些有哪些没有你可以自行搜索。

第二个问题是预检并不只检查 Access-Control-Allow-Origin(源),还要检查比如说 Access-Control-Allow-Methods(谓词)、Access-Control-Allow-Headers(标头)、Access-Control-Allow-Credentials(授权)等等,有一个不符合就预检失败了。

如果还要展开说的话可以再说说 Access-Control-Max-Age,类似缓存的 Cache-Control: max-age,它也是一定时间内浏览器就不会再发送预检请求了,直接根据上一次的预检结果做出应答。这种情况下实际上并没有发送请求给服务器。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进