发生跨域的时候,服务器到底有没有接收到请求?
背景:
大家好,我是 东东吖,一名前端工程师。今天,我发现前端技术交流群里的小伙伴比较安静,所以我丢了一个题目给大家讨论。
对于这个问题,其实很简单,但是大家作为前端工程师,没有接触过后端,所以难免会对这个问题不太了解。
口说无凭,实践出真理。接下来,我们就对这个问题进行验证,有助于大家理解深刻。
前提:
前提一:拥有一个客户端项目。在此之前,我是作为一个前端工程师的身份给大家讲解的,所以你自己要有建立前端项目的能力。当然,你也可以直接拉取我的github。
前提二:拥有一个后端服务器。对于后端,我将用node作为后端服务器,这篇文章可以帮助大家手把手搭建一个简单的服务器:从0到1学习Node.js系列教程(一):API接口初体验,当然,你也可以直接拉取我的github。
如果你跨域问题不太了解,不知道怎么解决跨域,可以先移步到我这篇文章: 跨域问题及前后端常见解决方案?
对于github拉取时网络超时问题,你可以通过修改host文件来解决。 找到host文件夹,用写字版打开,把ip复制粘贴到文件末尾,保存即可。
``` C:\Windows\System32\drivers\etc\HOSTS
https://github.com/140.82.1123 http://github.com
185.199.108.153 http://asset-cdn.github.com
199.232.69.194 http://github.global.ssl.fastly.net
185.199.108.133 http://githubusercontent.com
199.232.96.133 http://raw.githubusercontent.com
```
验证:
通过上面的两个大前提条件,你已经拥有了一个前端项目,也拥有了一个后端项目,你就可以来轻松验证我刚刚提出的问题了。
首先,我们来将拉取前后端项目,下载依赖,启动项目。 我们打开前端项目,点击node菜单栏,刷新浏览器,就会发送一个get请求和post请求,并且请求成功了。
打开我们的服务端,我们可以看见从前端项目发来的两个请求,并接收到了参数。
此时是因为我们在服务器端设置了跨域的代码,接下来,我们将注释掉服务器端解决跨域的代码,再次启动服务器端。
由于我们此时注释掉了解决跨域的代码,那么我们再去前端项目的node菜单栏刷新浏览器,就会发生跨域问题。
注释代码之后,你还可能发生get请求依然没有发生跨域,post请求发生了跨域,就像下面这样。
这个时候是因为缓存的原因,需要把缓存禁用掉,把Disable cache 打上√。再次刷新就会发现get请求和post请求都发生了跨域。
我们再来查看后端服务器的日志。
我们会发现,服务器是能接收到get请求,但是接收不到post请求,post请求只会接收到一个预检请求,接收不到真正的http请求。
总结:
简单请求,服务器是能接收到请求的,也会返回响应,但是返回的时候,会被浏览器拦截;复杂请求,浏览器会先发一个预检请求,去验证服务器是否允许跨域,如果允许跨越,才会发起真正的http请求,否则服务器接收不到真正的http请求。
如果你对简单请求、复杂请求(非简单请求)、预检请求等概念不了解,可移步到这篇文章: 面试官:说说你对 options 请求的理解
我是东东吖,一名前端工程师,关注我,带你走进前端的世界。
- 东东吖带你打通全栈,go-vue-react项目介绍
- 【vue进阶之旅】如何自定义组件v-model,封装属于自己的组件库?
- 【vue进阶之旅】如何使用keep-alive做组件缓存?
- 发生跨域的时候,服务器到底有没有接收到请求?
- vue进阶之路:vue3.2-setup语法糖、组合式API、状态库Pinia归纳总结
- 跨域问题及前后端常见解决方案?
- 微信小程序如何分包?
- 前端性能优化,如何提高首屏加载速度?
- 项目中的配置文件都是干嘛的?
- 从0到1学习Node.js系列教程(第一篇):API接口初体验
- 父子组件的生命周期执行流程是怎么样的呢?
- 1024程序员这天,我发现了掘金官方的一个bug。
- 组件通信的8种方式,你搞清楚了吗?
- 手把手教你利用XSS攻击体验一次黑客