token刷新并发 java_retrofit 刷新token并发处理

文章讨论了在app开发中处理token刷新并发的两种常见方案,特别聚焦于使用Retrofit时遇到的问题。当多个接口同时请求刷新token时,由于refreshToken的唯一性,可能导致后续请求失败。作者提出了三种解决思路:使用`synchronized`关键字、`synchronized`代码块以及`ReentrantLock`。强调多线程同步操作的资源消耗,并提醒开发者掌握更多知识以解决复杂问题。
摘要由CSDN通过智能技术生成

情况说明

在app开发中,我们需要保证用户登录之后,如果没有在其他设备上登录,则不需要再次登录,很多都会使用token作为安全令牌,开始阶段都会在登录时候获取,一直使用到下次登录。这样的token没有什么安全性可言,所以大多app都会做token时效性处理。

刷新token流程图如下:

0dd504933b9117f65a134734c297a347.png

刷新token流程图.png

暂时我了解的方案有两种:

在获取token的时候,同时获得token的有效时间和刷新token时用的refreshToken(只允许使用一次),在请求接口的时候判断token是否在有效期内,如若在这个时间内,则继续使用旧token,不在这个时间段则根据token和RefreshToken请求token刷新接口,重新获取;并且后台也会判断token是否有效,token无效,refreshToken有效,给出错误码,可以刷新token;token无效,refreshToken无效,给出错误码,重新登录获取token。

if ((currentTime - startTime) < validTime) {

//使用原有的token

} else {

//根据refreshToken刷新token,获取新的token

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java实现JWT token刷新可以通过以下步骤: 1. 在生成JWT token,将过期间(exp)设置为一个较短的间,比如10分钟。 2. 在生成JWT token,将JWT的唯一标识符(jti)设置为一个随机的字符串,并将其存储在服务器端的缓存或数据库中。 3. 当JWT token过期,客户端需要向服务器发送一个请求,请求刷新JWT token。 4. 服务器端验证客户端请求中的JWT token是否过期,并检查其jti是否存在于缓存或数据库中。如果验证通过,则生成一个新的JWT token,并将其返回给客户端。 5. 客户端收到新的JWT token后,将其保存到本地,并在下一次请求使用它。 下面是一个使用Java实现JWT token刷新的示例代码: ```java public class JwtUtils { private static final String SECRET_KEY = "your_secret_key"; private static final long EXPIRATION_TIME = 10 * 60 * 1000; // 10 minutes private static final String TOKEN_PREFIX = "Bearer "; public static String generateToken(String username) { String jwt = Jwts.builder() .setId(UUID.randomUUID().toString()) .setSubject(username) .setIssuedAt(new Date()) .setExpiration(new Date(System.currentTimeMillis() + EXPIRATION_TIME)) .signWith(SignatureAlgorithm.HS512, SECRET_KEY) .compact(); return TOKEN_PREFIX + jwt; } public static String refreshToken(String token) { Claims claims = Jwts.parser() .setSigningKey(SECRET_KEY) .parseClaimsJws(token.replace(TOKEN_PREFIX, "")) .getBody(); String username = claims.getSubject(); String jti = claims.getId(); // check if jti exists in cache or database if (isJtiValid(jti)) { return generateToken(username); } else { throw new JwtException("Invalid token"); } } private static boolean isJtiValid(String jti) { // check if jti exists in cache or database // return true if jti is valid, false otherwise } } ``` 在这个示例代码中,generateToken()方法用于生成JWT token,refreshToken()方法用于刷新JWT token。在刷新JWT token,我们首先解析出原始token中的username和jti,然后检查jti是否存在于缓存或数据库中。如果jti是有效的,则生成一个新的JWT token并返回给客户端;否则,抛出一个JwtException异常。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值