扫码登录的实现方式

文章讲述了前端在扫码登录过程中,通过短轮询、长轮询和WebSocket实现实时查询用户扫码结果的方法。短轮询简单但可能导致延迟和服务器压力;长轮询减少请求次数,复杂度高,适用于高实时性场景;WebSocket提供即时通信,需关注连接管理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

扫码登录过程:前端生成二维码,在登录页面等待用户扫码,用户扫码后判断扫码结果做下一步操作(成功:跳转首页,失败:提示用户)。为了即时知晓用户扫码结果,有三种方式来查询结果

1. 短轮询

实现:这种方式非常简单,写了一个定时器每间隔n秒向服务器发送http请求来查询用户扫码情况。
弊端:扫码后用户要等n秒才会页面感知,多久请求一次合适呢?频率太高会导致服务器压力大,如果放低页面感知的及时性就会降低。适合对实时性要求不高的场景!如在线聊天,天气更新等。有一点延时对用户体验不会造成重大影响。

 this.timmer = setInterval(async () => {
 		 const { data: res } = axios.post(...)  // 网络请求
 		 if(res.code === '扫码成功的code'){
 		 	 clearInterval(this.timmer)
             this.timmer = null
             this.$router.push('/home')
 		 }else if(res.code === "二维码失效code"){
 		     clearInterval(this.timmer)
             this.timmer = null
             // 刷新二维码
 		 }
 })

2. 长轮询

原理:客户端发送请求,如果服务端的数据没有发生变更,那么就hold住请求不返回结果,直到服务器端的数据发生了变更,或者达到了一定的时间就会返回,这样就减少了客户端和服务器不断链接和传递数据的过程,并且不会消耗服务端太多资源。(ps:需要服务端配合)
实现:轮询就是在发送第一次请求的时候,如果返回数据了那么就「在成功的回调里面再次发起这个请求」,就像递归一样,调用本方法。如果时间太久,「超时异常,同样的在失败回调里再次请求」,长轮询也「需要后台配合和约定」,如果没有数据的时候就不用返回。
好处是:减少了不必要的网络流量和请求次数,降低了服务器和客户端的资源消耗。
弊端是:实现更加复杂,并且需要服务器支持长时间保持连接的能力。适合对实时性要求较高的场景!如在线游戏,即时消息推送等。

 longReq() {
      const { data: res } = this.$http.get('XXXXXX').catch(() => {
        // 异常,连接超时,继续轮询
        this.longReq()
      })
      if (res.code === 204) {
        // 没有变化,继续轮询
        this.longReq()
      } else if (res.code === 200) {
        // 有变化,判断返回结果,做下一步操作
        // todo
      }
    }

3. websocket

TCP长连接。 即时通信,就是注意要在断了的时候,要做一个重连。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值