【Http】浏览器处理请求的那些事儿以及服务器代理实现
创始人
2025-06-01 19:35:59

浏览器处理请求的那些事儿以及服务器代理实现

  • 介绍
  • 源(Origin)
  • 浏览器是如何处理请求的
  • 服务器代理


介绍

本篇会解释下面这些问题:

  • 浏览器是如何处理请求的
  • 跨域是怎么回事儿
  • Cors处理跨域的底层逻辑是什么
  • 为何要对请求进行分类
  • 请求预检是怎么回事儿
  • 如何实现服务器代理(中转层)

源(Origin)

什么是源,什么是同源策略,这是个老话题了,简单过下。
Web 内容的源由用于访问它的 URL 的方案(协议)、主机名(域名)和端口定义。只有当协议、主机和端口都匹配时,两个对象才具有相同的源。

总结:只要两个URL的协议、域名和端口号都相同,就是同源;反之,则不是

浏览器为何要进行同源限制

为了安全,防止跨域访问时所带来的恶意攻击。这里提供一个漏洞练习的靶场,可以玩一下XSS , XSRF


浏览器是如何处理请求的

先简单介绍下基础概念:

浏览器会将请求分为两类

  • 简单请求
  • 非简单请求

这两个概念可以参考:

https://juejin.cn/post/7206264862657445947#commenthttps://github.com/amandakelake/blog/issues/62

至于为何要这么分类,可以参考分类原因

这里做个总结:
简单请求就是普通的get , post , head请求,没有额外的请求头。其他请求就都是非简单请求。

对简单请求,不会做预检请求。而对非简单请求,会做预检请求。也是为了安全考虑。

简单来说,预检请求就是在实际请求之前,浏览器先使用OPTIONS请求方式进行一次请求,为了验证服务器是否允许本次请求。如果允许,就继续完成实际的请求;如果不允许,浏览器就会拦截此次的实际请求。


具体是怎么做的,我们眼见为实,来实际操作一下。这里我们起两个服务器,前端使用Live Server,后端使用koa
前端地址:http://127.0.0.1:5500/index.html
后端地址:http://localhost:4001/
先来看简单请求,前端代码

// index.htmlconst xhr = new XMLHttpRequest();
xhr.open('GET', 'http://localhost:4001/string');
xhr.send();
xhr.onreadystatechange = function(e) {if(e.target.readyState === 4 && e.target.status === 200) {console.log(e.target.response);}
}

可以看到,前端发送了跨域请求
在这里插入图片描述
点进去可以看到
在这里插入图片描述
后端:
在这里插入图片描述

可以看到状态码是200,说明我们的请求是成功的,但是并没有数据返回,这是怎么回事儿呢?
实际过程是,在发送简单请求时,我们的请求是正常发出的,浏览器会通过cors带上Origin请求头,服务端会收到请求,把数据响应给浏览器。浏览器收到响应后,会检查响应头中是否有Access-Control-Allow-Origin字段,该字段值和请求头的Origin是否匹配。如果匹配,则浏览器不会拦截数据,我们就能拿到响应数据;如果不匹配,浏览器就会将数据拦截。

我们在后端配置cors跨域再重新请求,可以看到我们正常发送了一次请求,类型是xhr
在这里插入图片描述
点进去可以看到请求头的Origin字段和响应头的Access-Control-Allow-Origin的值是相同的
在这里插入图片描述
这样,前端就获取到了想要的数据
在这里插入图片描述


再来看看非简单请求和预检请求是怎么回事儿。我们以DELETE来触发预检请求,先让后端不允许跨域。
前端代码

const xhr = new XMLHttpRequest();
xhr.open('DELETE', 'http://localhost:4001/test');
xhr.send();
xhr.onreadystatechange = function(e) {if(e.target.readyState === 4 && e.target.status === 200) {console.log(e.target.response);}
}

后端代码:

router.delete('/test', async (ctx, next) => {ctx.body = '已删除'
})

此时,我们可以看到,虽然我们只发了一次请求,但是实际却请求了两次
在这里插入图片描述
第一次请求类型为preflight,即预检请求,状态码为404。第二次请求是我们的xhr,状态为跨域。
我们先看看预检请求做了什么
在这里插入图片描述
预检的请求方法是OPTIONS,而把我们实际的请求方法DELETE作为Access-Control-Request-Method的值。
再看后端的反应
在这里插入图片描述
后端给出了404,这过程中发生了什么
如果是非简单请求,浏览器会进行预检请求,请求方式为OPTIONS,向后端发送一次请求,来验证当前的跨域请求是否被服务器允许,如果不允许,浏览器就会拦截,让我们无法把请求发送给后端。所以这时候,后端并不会收到我们的DELETE请求。下图是我们的DELETE请求,什么请求也没有。
在这里插入图片描述
这时候,我们把后端设置cors允许前端的请求。我们的预检请求就会通过
在这里插入图片描述
之后的DELETE请求就会收到正常的响应结果,而且此时,后端收到的不是OPTIONS请求,而是我们的DELETE请求
在这里插入图片描述
当跨域请求可以正常响应时,浏览器依然会发送预检请求,但是当服务器同意我们的DELETE请求时,服务器就会按照预检请求中的Access-Control-Request-Method值作为正式请求方法,把结果响应给前端。所以我们在后端看到的是只有DELETE

总结:对于简单请求,浏览器是直接放行请求的,如果后端也会正常返回结果给浏览器。如果服务器并没有允许跨域请求,浏览器就会拦截此次响应结果,不返回给前端。
对于非简单请求,浏览器会先进行预检请求。如果后端不允许跨域请求,后端会收到OPTIONS请求,但并不会把结果返回给浏览器。如果后端允许跨域请求,后端会将Access-Control-Request-Method的值作为实际请求方式,把结果返回给浏览器。前端会显示两次请求,但是服务器始终只需进行一次响应。


服务器代理

跨域实现方法中,有一种方法叫做代理服务器实现跨域。原理就是服务器没有同源策略限制。如果前端想要获取服务器B中的资源,那么我们就建立一个服务器A,让前端向服务器A发送请求,A会把本次请求通过代理转接到服务器B上,前端就可以获取到服务器B的资源了。

具体如何实现呢,本次以koa为例。我们用koa再创建一个服务器B,地址为
http://localhost:3002
为了区分,我们把之前创建的http://localhost:4001服务器就成为服务器A。
先在B中写入创建一个接口

router.get('/resource', async (ctx, next) => {ctx.body = '呐!这是你要的资源!';
})

此时,直接向B发送请求,会报跨域错误

const xhr = new XMLHttpRequest();
xhr.open('GET', 'http://localhost:3002/resource');
xhr.send();
xhr.onreadystatechange = function(e) {if(e.target.readyState === 4 && e.target.status === 200) {console.log(e.target.response);}
}

在这里插入图片描述
现在我们来配置服务器A,让A来做代理服务器。首先,需要A需要打开跨域请求,允许前端向A发出请求。然后A需要将请求目标地址代理到B。下面直接看做法

// 在A中安装插件// 跨域插件
npm i koa2-cors 
// 这里我们使用的是express的跨域插件,因为这个好用
npm i http-proxy-middleware 
// koa不能直接使用express的插件,需要使用connect转接一下
npm i koa2-connect

然后在app.js中做如下配置:

app.use(cors());// https://github.com/chimurai/http-proxy-middleware
app.use(connect(// 代理全部以 / 开头的 HTTP 请求createProxyMiddleware('/', {target: 'http://localhost:3002', // 目标服务器B的地址changeOrigin: true	// 允许跨域}))
);

现在,让前端向A发送请求

const xhr = new XMLHttpRequest();
xhr.open('GET', 'http://localhost:4001/resource');
xhr.send();
xhr.onreadystatechange = function(e) {if(e.target.readyState === 4 && e.target.status === 200) {console.log(e.target.response);}
}

在浏览器中查看
在这里插入图片描述
成功获取到服务器B中的响应。


相关内容

热门资讯

729车牌啥意思(729车牌号... 本篇文章极速百科给大家谈谈729车牌啥意思,以及729车牌号什么意思对应的知识点,希望对各位有所帮助...
MTV中文是什么意思(mtv什... 今天给各位分享MTV中文是什么意思的知识,其中也会对mtv什么含义进行解释,如果能碰巧解决你现在面临...
花王纸尿裤u版e版区别 极速百... 花王纸尿裤u版e版区别目录花王纸尿裤u版e版区别花王纸尿裤u版e版区别花王纸尿裤底部有u字和e字,s...
代表奋斗的成语有哪些,表示坚持... 代表奋斗的成语有哪些目录代表奋斗的成语有哪些表示坚持不懈,努力拼搏的成语有哪些?写出四个表示艰苦奋斗...
奔腾B50的油耗是多少?(奔腾... 本篇文章极速百科给大家谈谈奔腾B50的油耗是多少?,以及奔腾b50的油耗怎么样对应的知识点,希望对各...
鼓励事业低谷男人的话,鼓励事业... 鼓励事业低谷男人的话目录鼓励事业低谷男人的话鼓励事业低谷男人的话 鼓励事业低谷男人的话列述老公事业不...
陪练车哪里找汽车陪练?驾驶陪练... 本篇文章极速百科给大家谈谈陪练车哪里找汽车陪练?驾驶陪练价格表,以及汽车陪练去哪个平台对应的知识点,...
四川音乐学院是一本吗,四川音乐... 四川音乐学院是一本吗目录川音是一本还是二本?四川音乐学院是一本吗,是二本吗? 川音是一本还是二本?二...
海信电视启动不起来怎么办,海信... 海信电视启动不起来怎么办目录海信电视启动不起来怎么办海信电视机启动不了怎么办海信液晶电视无法正常开机...
豆豆鞋配什么裤子好看,豆豆鞋穿... 豆豆鞋配什么裤子好看目录豆豆鞋配什么裤子好看豆豆鞋穿什么裤子搭配好看那个红色豆豆鞋搭配什么裤子好看豆...
五大洲四大洋(五大洲四大洋八方... 本篇文章极速百科给大家谈谈五大洲四大洋,以及五大洲四大洋八方聚对应的知识点,希望对各位有所帮助,不要...
拌面的酱汁怎么做好吃,拌面酱怎... 拌面的酱汁怎么做好吃目录拌面的酱汁怎么做好吃拌面酱怎么做简单又好吃拌面的拌酱怎么做好吃拌面的酱料怎么...
油价调整消息:明日国内油价或将... 今天给各位分享油价调整消息:明日国内油价或将下调,车主喜讯!的知识,其中也会对明日油价上涨进行解释,...
汽车汽油泵损坏有什么症状,汽油... 汽车汽油泵损坏有什么症状目录汽车汽油泵损坏有什么症状汽油泵坏了通常有什么异常现象汽油泵坏了有什么症状...
狗狗为什么跟疯了似的来回跑 极... 狗狗为什么跟疯了似的来回跑目录狗狗为什么跟疯了似的来回跑狗狗为什么跟疯了似的来回跑小狗有时像疯了一样...
在支付宝上怎么贷款,支付宝贷款... 在支付宝上怎么贷款目录在支付宝上怎么贷款支付宝贷款在哪里 支付宝贷款怎么申请在支付宝上怎么贷款在支付...
赛艇运动起源于哪个国家,奥运会... 赛艇运动起源于哪个国家目录赛艇运动起源于哪个国家奥运会传统比赛项目“赛艇”起源于欧洲哪个国家?赛艇运...
时空猎人首充号为什么充值会打折... 时空猎人首充号为什么充值会打折目录时空猎人首充号为什么充值会打折安卓手游充值折扣平台安卓手游充值折扣...
自助无人洗车机多少钱一台(24... 今天给各位分享自助无人洗车机多少钱一台的知识,其中也会对24小时自助共享洗车店要多少钱进行解释,如果...
白粥的做法,白粥的做法,白粥怎... 白粥的做法目录白粥的做法白粥的做法,白粥怎么做好吃,白粥的家常做法怎样煮白粥啊?白粥的做法 制...
包含抖音很火的叫爸爸是什么梗的... 今天给各位分享抖音很火的叫爸爸是什么梗的知识,其中也会对进行解释,如果能碰巧解决你现在面临的问题,别...
深圳欢乐谷的门票是怎么收费得,... 深圳欢乐谷的门票是怎么收费得目录深圳欢乐谷的门票是怎么收费得2022深圳欢乐谷万圣节老人免费吗?深圳...
阴阳师青蛙瓷器哪里多 极速百科... 阴阳师青蛙瓷器哪里多目录阴阳师青蛙瓷器哪里多阴阳师青蛙瓷器哪里多阴阳师的青蛙瓷器在哪个副本出现青蛙瓷...
一个G流量是多少MB流量,手机... 一个G流量是多少MB流量目录一个G流量是多少MB流量1G上网流量是多少MB一个G的流量等于多少MB一...
道台是什么官职 极速百科网 极... 道台是什么官职目录道台是什么官职道台是什么官职在清朝道台是个什么官“道台”是官职名吗道台是什么官职 ...
描写可怕的笑的成语笑得阴险可怕... 描写可怕的笑的成语笑得阴险可怕目录描写可怕的笑的成语笑得阴险可怕描写阴险的笑的成语表示阴险的笑有哪些...
贴春联的由来,贴春联的由来是什... 贴春联的由来目录贴春联的由来贴春联的由来是什么?贴春联的由来是什么?贴春联的由来 春联,又称对...
风雪夜归人的上一句是什么,柴门... 风雪夜归人的上一句是什么目录风雪夜归人的上一句是什么柴门闻犬吠,风雪夜归人。 上一句风雪夜归人 ;燕...
漂移是什么意思(摇杆漂移是什么... 本篇文章极速百科给大家谈谈漂移是什么意思,以及摇杆漂移是什么意思对应的知识点,希望对各位有所帮助,不...
车架号后四位是什么(车架号后四... 本篇文章极速百科给大家谈谈车架号后四位是什么,以及车架号后四位是什么在哪里看对应的知识点,希望对各位...