token解决了什么问题_plustoken官方网站

token解决了什么问题_plustoken官方网站面试官:说说token失效的处理方式

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

思路

1. token产生(存入本地)时的时间戳:用户成功登录,存token时记下此刻的时间戳A

2.token使用的时间戳:axios的请求拦截器中,请求会自动携带token,这就是使用token的时候,记下此刻的时间戳B

3.检查是否过期:时间差 = 时间戳B - 时间戳A ,将时间差与指定的token有效时长对比。如果大于有效时长,表示已经过期;如果小于有效时长,表示没过期

4.不同情况的处理

  • 已经过期:

    • 退出登录–清空token、当前用户信息,跳转到登录页
    • 更换token
  • 没过期:业务照常进行

那么废话不多说,我把代码给大家参考一下

  • 定义工具函数(先装包js-cookie
/* src/utils/auth.js */
import Cookies from 'js-cookie'

// 定义时间戳的key
const timeKey = 'hr-timestamp'

// 存时间戳
export function setTimeStamp() {
  return Cookies.set(timeKey, Date.now())
}

// 读时间戳
export function getTimeStamp() {
  return Cookies.get(timeKey)
}


  • 到Vuex中的登录函数中,记下登录成功时的时间戳 
import { setTimeStamp } from '@/utils/auth.js'
const actions = {
  /* 一、定义函数:用户登录 */
  /* 调用处:点击登录按钮时 */
  async login(context, payload) {
  
    // 1.发请求
    const res = await loginApi(payload)

    // 2. 存登录成功后的token ,token在响应数据res.data中
    context.commit('SET_TOKEN', res.data)
    
    // 3. token过期的主动处理:记下存token时的时间戳
    setTimeStamp()
  }
}

  • request.js中,定义过期时长、判断过期函数
/* src/utils/request.js */
import store from '@/store' 
import { getTimeStamp } from '@/utils/auth'
import router from '@/router'

// 定义过期时长
const TimeOut = 3600 // 单位:秒
// 定义判断过期函数
function checkTimeOut() {
  // 当前时间
  const currentTime = Date.now() 
  // 读取存token时的时间戳
  const timeStamp = getTimeStamp() 
  // 转换为秒后再比较
  const flag = ((currentTime - timeStamp) / 1000) > TimeOut 
  // 返回布尔值
  return flag 
}
  • request.js的请求拦截器中,编写业务逻辑
service.interceptors.request.use(
  (config) => {
    const token = store.getters.token  // 尝试读取token
    if (token) {
      /* token过期的主动处理 */
      if (checkTimeOut()) {
        /* return的flag为false,表示过期 */
        // 触发actions中的logout函数,清空当前过期的token(防止页面跳转错误)、清空用户信息
        store.dispatch('user/logout')
        // 跳转到登录页
        router.push({ path: '/login' })
        // return抛出一个执行错误, 用于终止promise的执行链
        return Promise.reject(new Error('token超时,请重新登录'))
      }
      // 如果token存在,就自动添加到请求头上
      // 注意:使用动态添加属性的形式。
      // 原因:如果headers中的Authorization之前不存在,这样能添加一个新属性;如果headers中的Authorization之前存在,这样能覆盖以前的token值
      config.headers['Authorization'] = `Bearer ${token}`
    }
    return config
  },
  
  (error) => {
    return Promise.reject(error)
  }
)

被动处理

被动处理:主要是后端的活儿,服务端处理token过期问题

思路

  1. 每次请求成功发送后,都会得到服务器的响应。经过后端的判断,如果当前的token失效,那么一定会在响应的数据中携带一个标识。或者说返回一个错误状态码,例如code:233333
  2. token过期属于响应失败,axios响应拦截器中的第二个回调会被触发
  3. 在响应拦截器的第二个回调中,编写token失效的业务逻辑:清除当前的失效token(防止页面无法跳转);跳转到登录页;return一个执行错误,用于终止当前的promise执行链
service.interceptors.response.use(
  (response) => {
      // dosomething
  },
  (error) => {
    // ! 服务器响应失败时,干些事情: 导致响应失败的原因有很多,其中之一是 token 过期
    // 响应失败时的error(错误对象),它经过了axios的2层包装,服务器响应的真实数据在 error.response.data 中。
    // axios包装的提示信息是:error.message,与服务器响应的真实数据是两回事
    const realData = error.response.data
    /* 处理token失效---后端处理 */
    if (error.response && realData && realData.code === 233333) {
      // 以上三个条件全部满足时,才说明token超时
      // 1. 触发actions中的logout函数,清除无效token、当前用户信息
      store.dispatch('user/logout')
      // 2. 跳转到登录页面
      router.push({ path: '/login' })
      // 3. return 一个执行错误,用于终止当前的promise执行链
      return Promise.reject(error)
    } else {
      /*  如果token未失效,则是其他错误 */
      // 1. 提示错误信息
      Message.error(realData.message)
      // 2. return 一个执行错误
      return Promise.reject(error)
    }
  }
)

本文参考我的一个朋友,他的文章也非常值得一看。

原文链接:面试官:说说token失效的处理方式 – 掘金

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/197807.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Tomcat的下载和安装教程,超级详细

    Tomcat的下载和安装教程,超级详细1、什么是Tomcat?tomcat是一个开源的轻量级Web应用服务器,在中小型系统和并发量小的场合下被普遍使用,是开发和调试Servlet、JSP程序的首选。最初由Sun公司的软件架构师詹姆斯·邓肯·戴维森开发,后来他帮助将其变为开源项目并由Sun公司贡献给Apache软件基金会。2、Tomcat的下载1)下载地址http://tomcat.apache.org/2)版本选择进入官网主页,看到左侧栏的download的下载目录,尽量不选择最新的版本,选择较为稳定的版本。目前最新的版本是

    2022年5月19日
    40
  • SpringBoot+Vue实现请求后台获取Base64编码的图片验证码并使用Redis缓存实现2分钟内有效

    SpringBoot+Vue实现请求后台获取Base64编码的图片验证码并使用Redis缓存实现2分钟内有效场景前端Vue的登录页面,验证码请求后台,后台生成验证码照片后使用Base64编码后,返回给前端,前端进行显示。注:博客:https://blog.csdn.net/badao_liumang_qizhi关注公众号霸道的程序猿获取编程相关电子书、教程推送与免费下载。实现首先看前端页面login.vue<el-form-itemprop=”code”><el-inputv-model=”log…

    2022年7月16日
    18
  • 从程序员到项目经理 技术荒废了_it售前工程师

    从程序员到项目经理 技术荒废了_it售前工程师从程序员到项目经理(一):为什么要当项目经理“从程序员到项目经理”,这个标题让我想起了很久以前一本书的名字《从Javascript到Java》。然而,从Javascript到Java充其量只是工具的更新,而从程序员到项目经理,却是一个脱胎换骨的过程。从Javascript到Java,是一个取巧的方法;而从程序员到项目经理,却并无捷径可走,必须从内而外的改变和提升。一.为什么要当项目经理

    2025年11月2日
    7
  • 在ubuntu安装的软件在哪里找_ubuntu如何安装gcc编译器

    在ubuntu安装的软件在哪里找_ubuntu如何安装gcc编译器在ubuntu安装vscode和可视化的代码跟踪调试在ubuntu安装vscode一、命令安装1.在网页下载deb安装包:https://code.visualstudio.com/Download2.在命令行安装:3.在命令行执行:二、汉化在ubuntu中用vscode编译调试C\C++一、安装插件二、编译运行程序在ubuntu安装vscode一、命令安装1.在网页下载deb安装包:https://code.visualstudio.com/Download2.在命令行安装:

    2022年9月17日
    4
  • vim编辑器,可以实现保存退出()_vim进入编辑模式如何保存并退出

    vim编辑器,可以实现保存退出()_vim进入编辑模式如何保存并退出目录1.Vim模式2.在Vim/Vi中打开文件3.在Vim/Vi中保存文件4.保存文件并退出Vim/Vi5.退出Vim/Vi而不保存文件1.Vim模式启动Vim编辑器时,您处于正常模式。在这种模式下,您可以使用vim命令并浏览文件。要输入文字,您需要按i键进入插入模式。使用此模式,您可以像在常规文本编辑器中一样插入和删除字符。要从其他任何模式返回正常模式,只需按Esc键。2.在Vim/Vi中打开文件要使用Vim打开文件,请键入vim,然后输入要编辑或创建的文件的.

    2022年8月24日
    9
  • python 去除字符串两端的引号[通俗易懂]

    python 去除字符串两端的引号[通俗易懂]使用遥感影像头文件时,需要获得里面的日期和时间信息,得到的字符串两端带有双引号,可以使用eval()函数去除。a='”srting”‘print(a)b=eval(a)print(b)结果:”srting”srting

    2022年6月9日
    129

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号