WebSocket和跨域问题
WebSocket
特点
WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议。简单来说,它就像是在客户端和服务器之间建立了一条"专用通道",双方可以随时主动发送消息给对方,而不需要像HTTP那样总是由客户端发起请求。
- 同一时间、双向同时传输的通信方式。
例如:
HTTP
就像是传统的邮件往来——你给朋友写信,必须等朋友回信后才能知道他的想法。WebSocket
就像是电话通话——双方可以随时说话,随时听到对方的回应,交流更加自然流畅。
与 http 的区别
HTTP
协议的交互过程,是非常典型的“一问一答”
- 单向性,只能由客户端主动发起请求
- 无状态性,每次请求都是独立的
- 短连接,一次请求完成后连接就会断开
这种设计在传统的网页浏览场景下工作得很好,但当我们需要服务器主动推送数据时就会遇到问题。比如-
- 如果要实现一个实时消息对话功能,使用
HTTP
的话,前端只能不断地轮询服务器:"有新数据吗?有新数据吗?"这种方式不仅浪费资源,还存在明显的延迟。
WebSocket
从根本上解决了这个问题。它通过 HTTP
握手建立连接后,就会升级为 WebSocket
协议,形成一个持久的全双工通信通道。服务器可以随时主动推送数据,客户端也可以随时发送数据,双方的地位是平等的
使用场景
虽然 WebSocket
有很多优势,但并不意味着它应该完全取代 HTTP
。选择使用哪种协议主要取决于具体的应用场景
- 如果需要频繁的双向数据交换,比如在线聊天、多人游戏、协作编辑、实时监控等,
WebSocket
是最佳选择。它能够提供近乎即时的响应速度,用户体验会显著提升 - 如果只是普通的网页浏览、API 调用、文件上传下载等场景,
HTTP
仍然是更好的选择。HTTP
协议更简单、更稳定,也更容易调试和缓存。而且,现代浏览器对HTTP
的优化已经相当成熟
跨域问题
同源策略
浏览器出于安全考虑,实施的一种策略
- 只允许来自同一源(即协议+域名+端口都相同)的请求访问,否则就会导致跨域问题
例如:
http://xxxx.com
——>https://xxxx.com
:存在跨域,协议不同127.x.x.x:8001
——>127.x.x.x:8002
:存在跨域,端口不同www.xxxx.com
——>www.yyyy.com
:存在跨域,域名不同
解决办法
找一个中间人——配置一个代理服务器
前端直接请求后端接口的话,肯定越不过同源策略,会造成跨域问题。因为前端服务端口和后端服务端口肯定是不一样的。
我们可以配置一个代理服务器,前端有请求之后,先请求和其同源的代理服务器,然后再去请求后端服务
- 因为服务器不受同源策略的影响