4-08:用户被动退出解决方案之被动处理

441 阅读2分钟

4-08:用户被动退出解决方案之被动处理

上一节我们处理了 用户被动退出时的主动处理 ,那么在这一小节我们去处理 用户被动退出时的被动处理

还是和上一小节一样,我们还是先明确背景,然后再来明确业务逻辑。

背景:

首先我们需要先明确 被动处理 需要应对两种业务场景:

  1. token 过期
  2. 单用户登录

然后我们一个一个来去看,首先是 token 过期

我们知道对于 token 而言,本身就是具备时效的,这个是在服务端生成 token 时就已经确定的。

而此时我们所谓的 token 过期指的就是:

服务端生成的 token 超过 服务端指定时效 的过程

而对于 单用户登录 而言,指的是:

当用户 A 登录之后,token 过期之前。

用户 A 的账号在其他的设备中进行了二次登录,导致第一次登录的 A 账号被 “顶下来” 的过程。

即:同一账户仅可以在一个设备中保持在线状态

那么明确好了对应的背景之后,接下来我们来看对应的业务处理场景:

从背景中我们知道,以上的两种情况,都是在 服务端进行判断的,而对于前端而言其实是 服务端通知前端的一个过程。

所以说对于其业务处理,将遵循以下逻辑:

  1. 服务端返回数据时,会通过特定的状态码通知前端
  2. 当前端接收到特定状态码时,表示遇到了特定状态:token 时效单用户登录
  3. 此时进行 退出登录 处理

但是这里大家需要注意,因为咱们课程的特性,同一个账号需要在多个设备中使用,所以说此时将不会指定 单用户登录 的状态码,仅有 token 失效 状态码。之后当大家需要到 单用户登录 时,只需要增加一个状态码判断即可。

那么明确好了业务之后,接下来我们来实现对应代码:

utils/request 的响应拦截器中,增加以下逻辑:

// 响应拦截器
service.interceptors.response.use(
  response => {
    ...
  },
  error => {
    // 处理 token 超时问题
    if (
      error.response &&
      error.response.data &&
      error.response.data.code === 401
    ) {
      // token超时
      store.dispatch('user/logout')
    }
    ElMessage.error(error.message) // 提示错误信息
    return Promise.reject(error)
  }
)

那么至此,我们就已经完成了 整个用户退出 方案。