这个月基本没有什么产出,在这里愧对服务器画的钱,开花谢罪了。
好的,废话少说,进入正题,这个月是这样的,笔记当中记录了一些axios 的相关知识点。
这个问题的发现是这样的,在某天调试nuxt本地的时候,发现了一个bug问题,axios 相关会发起二次请求。仔细的去看了一眼请求头,我发现了问题。
axios 请求接口发起两次请求(OPTIONS 与 POST/GET)
没有错, 它会发送一次预请求 OPTIONS。 那么我当时就在思考一个问题,问题是有的时候发,有的时候为什么又不发呢。
说起这个问题,就可能会扯到,跨越资源共享(CORS),这个东西能一般是后端同学配置好。前端同学直接跨域请求使用。
例如,参考文档上的说法,
跨域资源共享 (CORS) 是一种机制,它使用额外的 HTTP 头来告诉浏览器,让运行在一个 origin (domain)上的Web应用被准许访问来自不同服务器上的指定的资源。当一个资源从与该资源本身的所在的服务器不同的域、协议或端口请求一个资源时,资源会发起一个跨域HTTP请求。比如,站点 http://domain-a.com 的某HTML 页面 通过 的 src 请求 http://domain-a.com/image.jpg.网络上的许多页面都会加载来自不同域的CSS样式表,图像和脚本等资源。
出于安全原因,浏览器限制从脚本内发起的跨源HTTP请求。 例如, XMLHttpRequest 和 Fetch API 遵循同源策略。 这就意味着使用这些API的Web应用程序只能从加载应用程序的同一个域请求HTTP资源,除非响应报文包含了正确的CORS响应头。
跨域资源共享 (CORS) 机制允许 Web 应用服务器进行跨域访问控制,从而使跨域数据传输得以安全进行。现代浏览器支持在 API 容器中(例如 XMLHttp Request 或 Fetch)使用 CORS, 以降低跨域HTTP请求带来的风险。
由于本地跨域所以做出 一次 OPTIONS 请求,服务器就不会了因为服务不存在跨域
若干访问控制场景
这里,我们使用三个场景来解释跨域资源共享机制的工作原理。这些例子都使用 XMLHttpRequest 对象。
简单请求
某些请求不会触发 CORS 预检请求,本文称这样的请求为“简单请求”,请注意,该术语并不属于Fetch(其中定义了CORS)规范。若请求满足所有下述条件,则该请求可视为“简单请求”:
使用下列方法之一:
GET
HEAD
POST
Fetch 规范定义了对CROS 安全的首部字段集合,不得人为设置该集合之外的其他首部字段。该集合为:
Accept
Accept-Language
Content-Language
Content-Type(需要注意额外限制)
DPR
Downlink
Save-Data
Viewport-Width
Width
Content-Type 的值仅限于下列三者之一:
text/plain
multipart/form-data
application/x-www-form-urlencoded
请求中任意 XMLHttpRequestUpload 对象均没有任何时间监听器;
XMLHttpRequestUpload 对象可以使用 XMLHttpRequest.upload 属性访问
说了这么多,就是因为出现了跨域,导致了axios 发预检请求,由于它发了预检请求,所以我们看到它的请求是俩次。
大多数也是查的资料写的并不好, 结尾说一句,其实不让axios 发送预检也是可以的,但是预检没有害处。 如果服务上线之后就部署在同一个服务器,那么,预检请求自己就会消失(不存在跨域了)
以下是参考资料
https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Basics_of_HTTP/MIME_types
https://blog.csdn.net/qq_27626333/article/details/77005911
https://blog.csdn.net/qq_27626333/article/details/77005911
感谢观看。。。
文章采用 知识共享署名 4.0 国际许可协议 进行许可,转载时请注明原文链接。