您的位置:

如何处理Token过期问题——全能开发工程师的解决方案

Token是指代表着用户身份的字符串,当用户进行登录认证后,系统会生成并返回一个Token,以后用户的每一次请求都需要携带该Token以便服务器对其进行身份校验。然而,Token的过期问题是一个需要我们开发人员重视的问题。本文将从多个方面介绍如何处理Token过期问题,给出详细的解决方案。

一、Token过期的原因

1、用户长时间未进行操作,导致Token失效;
2、Token设置的过期时间到期;
3、服务器端的Token存储出现异常。

对于以上原因,我们可以分别进行处理:

二、方案1:Token超时处理

当用户在一段时间内没有进行任何操作,Token就可能失效。解决方法是通过设置一个超时时间,在规定时间内用户没有任何操作则Token失效,需要重新登录获取新的Token,从而保证安全性。

1.在后台服务器设置Token超时时间

//token过期时间:30min
const EXPIRE_TIME=30*60*1000;

2.前端请求时校验Token是否过期

let timestamp=Date.now();
let expireTime=localStorage.getItem('expireTime');
if(timestamp-expireTime>EXPIRE_TIME){
  console.log('Token已过期,请重新登录!');
  logout();//退出登录
}else{
  //继续请求操作
}

在请求前需要通过localStorage获取Token的过期时间expireTime,与服务器的当前时间进行比较。若当前时间与过期时间差值大于Token过期时间,则Token失效,需要重新登录,退出当前操作。

三、方案2:禁止多处登录

当用户进行多处登录时,Token也会过期,此时需要提示用户当前设备已登录,禁止重复登录。

1.记录Token登录状态

/**
 * 记录Token是否已经登录
 * @param {*} token 
 */
export function setTokenLoginStatus(token, status = true) {
  localStorage.setItem(`token_status_${token}`, status);
}

2.检查Token当前是否已经登录

/**
 * 检查Token当前是否已经登录
 * @param {*} token 
 * @returns 
 */
export function checkTokenLoginStatus(token) {
  return !!localStorage.getItem(`token_status_${token}`);
}

通过localStorage记录每个Token的登录状态。当用户进行多处登录时,后面的登录会将前面的登录Token状态覆盖,此时需要提示用户当前设备已登录,禁止重复登录。

四、方案3:Token过期自动刷新

Token过期,用户需要重新登录获取新的Token,这一过程可能会影响用户体验。为了解决这个问题,可以通过定期刷新获取新的Token,从而保证Token一直有效。

1.前端定期刷新Token

let refreshInterval=50*60*1000;//若前端的Token存在超过50min,定期向服务器请求刷新Token
setInterval(()=>{
  refreshToken();
},refreshInterval);

在前端定期刷新Token,若当前Token存在超过规定时间(例如50min),自动向服务器请求刷新Token。此时需要注意,Token刷新的过程要保证前后端的操作的一致性,尤其是在Token刷新存在失败逻辑时需要加入错误处理。

2.后端Token刷新接口

/**
 * 刷新Token接口:请求之前需要校验Token过期,通过后则生成新的Token,并存储至Token中
 * @param req
 * @param res
 * @returns {Promise}
 */
async function refreshToken(req, res) {
    const token = req.session.token;
    const tokenInfo = await verifyToken(token);
    const { payload } = tokenInfo;
    const { userId, username, platforms, appid } = payload;
    let newToken = generateToken(userId, username, platforms, appid);
    await saveToken(newToken, userId);
    res.json({
        code: '000000',
        message: 'refresh token success!',
        payload: newToken
    });
}

  

在后端编写刷新Token接口,需要先对原Token进行信息解密,获取到原Token所代表的用户信息,然后生成新Token存储至Token中,同时返回给前端。这里需注意,新Token的存储需要替换原Token,以保证Token的一致性,用户不必重新登录。

五、结语

Token过期问题是一个需要开发者思考和解决的实际问题。本文介绍了多种方案:设置Token超时时间、禁止多处登录、定期刷新Token。对于Token过期自动刷新,一定要在前后端操作的一致性上保证,同时还需注意错误处理。通过这些方案,可以使得Token问题得到良好的解决和管理,为后续的开发操作提供了良好的基础和保障。

如何处理Token过期问题——全能开发工程师的解决方案

2023-05-18
java里token已过期怎么办,如果token过期了,交给

2022-11-18
php开发工程师,php开发工程师是干嘛的

2023-01-04
Xuneli-全能开发工程师的解决方案

2023-05-21
上海招php开发工程师,上海招php开发工程师

2023-01-06
java方法整理笔记(java总结)

2022-11-08
jsp程序开发学习笔记2,jsp程序设计题库

本文目录一览: 1、《JSP&Servlet学习笔记》pdf下载在线阅读,求百度网盘云资源 2、林信良编著jsp&servlet学习笔记第2版课后答案吗 3、jsp有没有快速掌握的办法呀? 4、要学J

2023-12-08
java客户端学习笔记(java开发笔记)

2022-11-14
python课堂整理32(python笔记全)

2022-11-12
php工程师php开发招聘,PHP工程师PHP招聘

2023-01-06
印象笔记记录java学习(Java成长笔记)

2022-11-12
包含一个token的有效期为两个小时怎么处理比较好java的

2022-11-28
工作一年的php开发工程师,工作一年的php开发工程师工资多

2022-11-17
java高级工程师笔试题及答案(java中高级笔试题)

2022-11-15
APIPOST7:全能编程开发工程师的首选接口调试工具

2023-05-20
c语言程序员工资,c语言开发工程师工资

2022-11-24
2年php开发工程师(php开发工程师薪资)

2022-11-09
java笔试面试题整理第八波,java程序员面试笔试真题与解

2022-11-21
pythontip:满足你成为全能编程开发工程师的所有需求

2023-05-18
java笔试题分类总结,java面试题及答案整理

2022-11-16