Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

OPTIONS预检相关内容 #15

Open
lovelmh13 opened this issue Feb 16, 2020 · 0 comments
Open

OPTIONS预检相关内容 #15

lovelmh13 opened this issue Feb 16, 2020 · 0 comments

Comments

@lovelmh13
Copy link
Owner

lovelmh13 commented Feb 16, 2020

什么是预检

我发现我请求一个接口,却发送了两次请求。第一次被称为预检。

预检,实在CORS跨域的时候才有的东西。

CORS里面有简单请求和复杂请求。复杂请求可以理解成是可能会对服务产生副作用,浏览器为了安全考虑就会限制发起跨源的请求。get post都无效。但是OPTIONS可以响应。这个OPTIONS就是预检。

"预检"请求实际上是对服务端的一种权限请求,只有当"预检"请求成功返回,实际请求才开始执行。

所以,才会出现请求了两次的现象。

简单请求和复杂请求

这个直接看MDN,是最有保障的。

一个例子

我使用的Axios,在请求头中加入了config.headers.Authorization来传递token
然后定义了config.headers.post['Content-Type'] = 'application/json';

入MDN上说,我这个肯定是复杂请求了。

我的个人项目,每次请求都有两次:
1

这次是预检
2

这次是返回数据
3

disable cache也有关系

但是在我看掘金的请求的时候,也是Content-Type: application/json,就没有看见OPTIONS预检这一项呢?
就是下图:
4

难道掘金不是复杂请求吗?而且我看网站,都没有看见OPTIONS预检。是因为大家都给设置了Access-Control-Max-Age,减少了预检吗?

不是的,是因为控制台没有勾选Disable cache 强制不缓存。勾选Disable cache 再看,就能看到预检的请求了。

目前还存在的疑问

显示OPTIONS预检跟disable cache有关,那OPTIONS预检,算缓存?为啥开了缓存以后,就不显示了,而不是显示强缓存呢?

减少预检

后端设置Access-Control-Max-Age来控制浏览器在多长时间内(单位s)无需在请求时发送预检请求,从而减少不必要的预检请求。

参考

CORS跨域时,为何会出现一次动作,两次请求?
我自己的提问:关于CORS是复杂请求却没有预检的问题

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant