文章目录
一、浏览器
1.1 跨域
1.1.1 什么是跨域
跨域是浏览器基于同源策略(Same-Origin Policy)实施的安全限制机制,需同时满足以下三个条件才会触发:
- 运行环境:发生在浏览器环境中
- 请求类型:涉及向后端接口发起的请求
- 策略触发:违反了同源策略规则
同源策略要求(三者必须完全相同):
- 协议(http/https)
- 域名(包括子域名)
- 端口号
只要任一条件不满足,浏览器就会触发跨域限制。
1.1.2 解决跨域的方法
- 后端配置CORS
通过设置响应头(如Access-Control-Allow-Origin)允许特定源访问。 - 本地开发代理(Proxy)
利用开发服务器(如webpack/vite)的代理功能转发请求。 - JSONP
通过动态script标签绕过限制(仅限GET请求)。
1.1.3 服务端请求服务端会跨域么
跨域是浏览器的安全策略,服务端之间的通信(如Node.js发起HTTP请求)不受同源策略限制。
1.1.4 webpack或者vite中可以使用proxy解决跨域,它解决跨域的原理是什么
原理:在本地开发时,代理服务器充当中间人:
- 浏览器 → 请求发送到本地代理服务器(同源,避免跨域)。
- 代理服务器 → 转发请求到目标后端服务器(服务端无跨域限制)。
- 结果通过代理返回给浏览器。
本质:通过隐藏真实后端地址,绕过浏览器的同源策略。
1.1.5 为什么跨域的时候有时候请求会发两次
对于非简单请求(如带自定义头或非标准Content-Type),浏览器会先发送一次OPTIONS方法的预检请求(Preflight Request),确认服务器允许实际请求后,才会发送真实请求。
1.1.6 为什么非要有这个预检请求
核心目的:安全性保障。
- 权限确认:确保服务器明确允许跨域请求的特定方法、头部和字段。
- 减少风险:避免恶意脚本直接发送非常规请求(如PUT/DELETE)。
类比:类似于访问权限门禁,先验证身份(预检),再放行正式操作。
1.1.7 总结
跨域是浏览器出于安全考虑(同源策略)对非同源请求(协议、域名、端口任一不同)的限制,常见解决方案包括后端配置CORS、开发服务器代理(如webpack/vite的proxy)或JSONP。服务端间通信无跨域问题,而浏览器中非简单请求(如带自定义头)会先发OPTIONS预检请求,以确认服务器允许实际请求,确保安全性。代理的原理是通过本地同源服务器转发请求,绕过浏览器限制。
1.2 GET和POST的区别
1.2.1 什么是 HTTP?
HTTP(Hypertext Transfer Protocol)超文本传输协议。它是建立在TCP/IP协议之上,用于客户端和服务器之间的通信和数据交换。
1.2.2 HTTP 方法
- GET:请求指定的资源
- POST:向指定资源提交数据进行处理请求(例如提交表单或上传文件)。POST请求经常用于创 建、更新或删除服务器上的资源。
- PUT:向指定资源位置上传其最新内容。
- DELETE:请求服务器删除指定的资源。
- HEAD:请求获取指定资源的元数据信息,但不返回资源本身的内容。
- PATCH:用于对资源进行局部修改。
- OPTIONS:请求获取指定资源支持的通信协议和方法等信息。
- CONNECT:建立一个网络连接,使用隧道协议连接代理。
- TRACE:回显服务器收到的请求,主要用于测试或诊断。
最常用的两种方法是:GET 和 POST。
1.2.3 共同点
GET和POST请求都是HTTP协议中常见的请求方式,底层都是基于TCP/IP协议实现的,使用二者的任意一个,都可以实现客户端和服务器端的双向交互。
1.2.4 不同点
语义
GET的语义是从服务器获取指定的资源,而POST的语义是根据请求负荷(报文body)对指定的资源做出处理。
请求参数
- GET请求的参数一般会附加在URL后面,以问号(?)开头,参数之间用&符号分割,而且URL的长度是有限制的,通常为2k,当浏览器厂商不同、版本不同这个限制的大小值也可能不同;这是因为服务器解析一个字符串时需要分配内存,而URL必须作为一个整体去看待,没有办法分块处理,于是必须预先分配一块足够大的内存来存储URL。如果URL太长或者并发量高的话就会对服务器造成压力,为了解决这个性能问题所以做了不同程度的限制。
- POST请求参数是存放在请求正文(request body)中的,所以没有大小限制。
浏览器
- GET请求一般会被缓存,比如常见的CSS、JS、HTML请求都会被缓存;而POST请求默认是不进行缓存的。
- GET请求可以直接进行回退和刷新,不会对用户和程序产生任何影响;而POST请求如果直接回滚和刷新将会把数据再次提交
- GET请求的参数会保存在历史记录中,而POST请求的参数不会保留到历史记录中。
- GET请求的地址可被收藏为书签,而POST请求的地址不能被收藏为书签。
幂等性
- GET请求是幂等的,即多次请求相同的URL和参数,得到的结果是一样的,不会产生副作用。
- POST请求是不严格幂等的,因为多次发送相同的POST请求所得到的结果可能不同。
1.2.5 安全性
HTTP协议里GET和POST本质上只是请求方式的不同,协议并没有做过多的限制,只是从规范约定于更加倾向于把GET请求参数拼接在URL上,把POST请求放在body里,直观上会从URl看到参数显得没那么安全。但是从网络安全角度而言这两种方式都是明文的,HTTP本身就是不安全的协议。请求在任何一个网络节点被劫持内容都是透明的,真正要做到安全要求双端加密,如HTTPS。
1.2.6 总结
GET适用于获取资源,不对服务器数据产生影响,幂等性要求较高。
POST适用于提交,修改或者删除资源,对服务器数据产生影响的操作,以及要传输敏感信息的情况。