Token过期实现自动续期的方法步骤

 更新时间:2026年05月29日 09:31:58   作者:海棠Flower未眠  
本文详细解析了Token在防止表单重复提交、身份验证及过期处理中的应用,涵盖Token的生成流程、过期机制及续期方案,特别介绍了单token与双token两种策略,需要的朋友可以参考下

相信小伙伴对Token再熟悉不过了,token主要有两个作用:

一、Token的作用

1.防止表单重复提交

防止表单重复提交一般还是使用前后端都限制的方式。比如:在前端点击提交之后,将按钮置为灰色,不可再次点击,然后客户端和服务端的token各自独立存储,客户端存储在Cookie或者Form的隐藏域中,服务端存储在Session或者其他缓存系统中。

2.用来作身份验证(流程)

① 客户端使用用户名跟密码请求登录;

②通过ajax向后端发送请求;

③服务端收到请求,去验证用户名与密码;

④验证成功后,服务端会签发一个 Token,再把这个 Token 发送给客户端;

⑤客户端收到 Token 以后可以把它存储起来,比如放在 Cookie 里或者 Local Storage 里;

⑥客户端每次向服务端请求资源的时候需要带着服务端签发的 Toke(不管是你自己写的)它都要通过ajax向后端发送请求,这时服务端收到请求,然后去验证客户端请求里面带着的 Token,如果验证成功,就向客户端返回请求的数据。

二、Token‌过期

Token‌过期通常意味着身份验证的凭证已经达到其设定的有效期,需要用户重新进行身份验证或使用刷新Token来获取新的访问Token。 

这种情况通常发生在以下几种情境中:

  • 安全性:为了防止Token被长期使用,设置过期时间可以减少因Token被窃取或泄露而带来的安全风险。
  • 数据一致性:Token的过期可以帮助确保服务器上的用户数据与Token中携带的数据保持一致,避免因Token长期有效而导致的数据不同步问题。
  • 性能优化:长时间有效的Token会增加网络传输的开销和服务器的处理负担,通过设置过期时间,可以优化系统性能。

处理Token过期的方法包括:

  • 重新获取授权码:用户需要与授权服务器交互以获取新的访问Token和(如果适用)刷新Token。
  • 使用刷新Token:如果应用程序使用了刷新Token,可以通过它来请求新的访问Token,从而避免用户重新登录。
  • 黑名单机制:通过维护一个黑名单,将无效的Token列入其中,以确保只有有效的Token才能被接受。

JWT token的 payload 部分是一个json串,是要传递数据的一组声明,这些声明被JWT标准称为claims。

JWT标准里面定义的标准claim包括:

  • iss(Issuser):JWT的签发主体;
  • sub(Subject):JWT的所有者;
  • aud(Audience):JWT的接收对象;
  • exp(Expiration time):JWT的过期时间;
  • nbf(Not Before):JWT的生效开始时间;
  • iat(Issued at):JWT的签发时间;
  • jti(JWT ID):是JWT的唯一标识。

除了以上标准声明以外,我们还可以自定义声明。以 com.auth0 为例,下面代码片段实现了生成一个带有过期时间的token。

String token = JWT.create()
    .withIssuer(ISSUER)
    .withIssuedAt(new Date(currentTime))// 签发时间
    .withExpiresAt(new Date(currentTime + EXPIRES_IN * 1000 * 60))// 过期时间戳
    .withClaim("username", username)//自定义参数
    .sign(Algorithm.HMAC256(user.getPassword()));

其中:

  • withIssuer() 设置签发主体;
  • withIssuedAt() 设置签发时间;
  • withExpiresAt() 设置过期时间戳,过期的时长为 EXPIRES_IN (单位秒);
  • withClaim() 设置自定义参数。

JWT设置了过期时间以后,一定超过,那么接口就不能访问了,需要用户重新登录获取token。如果经常需要用户重新登录,显然这种体验不是太好,因此很多应用会采用token过期后自动续期的方案,只有特定条件下才会让用户重新登录。

三、token过期的续期方案

解决token过期的续期问题可以有很多种不同的方案,这里举一些比较有代表性的例子。首先我们看一个单token方案,这个方案除了可以实现token续期以外,还可以实现某些条件下的强制重新登录。

3.1.单token方案

  • 将 token 过期时间设置为15分钟;
  • 前端发起请求,后端验证 token 是否过期;如果过期,前端发起刷新token请求,后端为前端返回一个新的token;
  • 前端用新的token发起请求,请求成功;
  • 如果要实现每隔72小时,必须重新登录,后端需要记录每次用户的登录时间;用户每次请求时,检查用户最后一次登录日期,如超过72小时,则拒绝刷新token的请求,请求失败,跳转到登录页面。

另外后端还可以记录刷新token的次数,比如最多刷新50次,如果达到50次,则不再允许刷新,需要用户重新授权。

上面介绍的单token方案原理比较简单。下面我们再看一个双token方案。

3.2.双token方案

  • 登录成功以后,后端返回 access_token 和 refresh_token,客户端缓存此两种token;
  • 使用 access_token 请求接口资源,成功则调用成功;如果token超时,客户端携带 refresh_token 调用token刷新接口获取新的 access_token;
  • 后端接受刷新token的请求后,检查 refresh_token 是否过期。如果过期,拒绝刷新,客户端收到该状态后,跳转到登录页;如果未过期,生成新的 access_token 返回给客户端。
  • 客户端携带新的 access_token 重新调用上面的资源接口。
  • 客户端退出登录或修改密码后,注销旧的token,使 access_token 和 refresh_token 失效,同时清空客户端的 access_token 和 refresh_toke

微信网页授权是通过OAuth2.0机制实现的,也使用了双token方案。

微信网页授权方案:

  • 用户在第三方应用的网页上完成微信授权以后,第三方应用可以获得 code(授权码)。code的超时时间为10分钟,一个code只能成功换取一次access_token即失效。
  • 第三方应用通过code获取网页授权凭证access_token和刷新凭证 refresh_token。
  • access_token是调用授权关系接口的调用凭证,由于access_token有效期(2个小时)较短,当access_token超时后,可以使用refresh_token进行刷新。
  • refresh_token拥有较长的有效期(30天),当refresh_token失效的后,需要用户重新授权。

后端实现token过期还可以利用Redis来存储token,设置redis的键值对的过期时间。如果发现redis中不存在token的记录,说明token已经过期了。

以上就是Token过期实现自动续期的方法步骤的详细内容,更多关于Token过期自动续期的资料请关注脚本之家其它相关文章!

相关文章

  • Spring Batch是什么

    Spring Batch是什么

    SpringBatch是Spring框架的批量处理工具,支持大规模数据任务、错误处理及监控,在SpringBoot中通过Starter简化集成,结合分页、Swagger、ActiveMQ等技术,具备高性能和健壮性,适用于数据迁移、报表生成等场景,本文介绍Spring Batch是什么的相关知识,感兴趣的朋友一起看看吧
    2025-07-07
  • JMeter自定义日志与日志分析的实现

    JMeter自定义日志与日志分析的实现

    JMeter与Java程序一样,会记录事件日志,本文就介绍一下JMeter自定义日志与日志分析的实现,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-12-12
  • Java中HashSet和HashMap的区别_动力节点Java学院整理

    Java中HashSet和HashMap的区别_动力节点Java学院整理

    这篇文章主要介绍了Java中HashSet和HashMap的区别_动力节点Java学院整理,需要的朋友可以参考下
    2017-04-04
  • Java Instrumentation从概念到基本用法详解

    Java Instrumentation从概念到基本用法详解

    Java Instrumentation是java.lang.instrument包提供的 API,允许开发者在类被JVM 加载时对其进行修改,或者在运行时重新定义类的字节码,本文给大家介绍Java Instrumentation从概念到基本用法详解,感兴趣的朋友一起看看吧
    2025-09-09
  • Java由浅入深讲解继承下

    Java由浅入深讲解继承下

    继承就是可以直接使用前辈的属性和方法。自然界如果没有继承,那一切都是处于混沌状态。多态是同一个行为具有多个不同表现形式或形态的能力。多态就是同一个接口,使用不同的实例而执行不同操作
    2022-04-04
  • 分布式Netty源码分析概览

    分布式Netty源码分析概览

    这篇文章主要为大家介绍了分布式Netty源码分析概览,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-03-03
  • 详解Spring注入集合(数组、List、Map、Set)类型属性

    详解Spring注入集合(数组、List、Map、Set)类型属性

    这篇文章主要介绍了详解Spring注入集合(数组、List、Map、Set)类型属性,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • Java 使用poi把数据库中数据导入Excel的解决方法

    Java 使用poi把数据库中数据导入Excel的解决方法

    本篇文章介绍了,Java 使用poi把数据库中数据导入Excel的解决方法。需要的朋友参考下
    2013-05-05
  • Java使用Soap方式调用WebService接口代码示例

    Java使用Soap方式调用WebService接口代码示例

    Java调用WebService接口是指通过Java语言来访问并与WebService进行交互,WebService是一种基于Web的服务架构,它通过标准的XML和HTTP协议来提供服务,这篇文章主要给大家介绍了关于Java使用Soap方式调用WebService接口的相关资料,需要的朋友可以参考下
    2024-03-03
  • SpringBoot中内置的49个常用工具类使用

    SpringBoot中内置的49个常用工具类使用

    SpringBoot以其强大的自动配置和丰富的生态系统成为Java开发的首选框架,本文将介绍49个常用工具类,并通过简洁的代码示例展示它们的基本用法,希望对大家有一定的帮助
    2025-04-04

最新评论