使用Java设置JWT Token的失效时间

JSON Web Tokens(JWT)是用于安全数据传输的一种紧凑、安全且自包含的信息格式。在与用户身份验证和会话管理相关的应用程序中,JWT 广泛使用。设置JWT的失效时间是非常重要的,这样可以确保如果一个Token被截取,攻击者能够使用它的时间是有限的。本文将带领你一步一步地实现这一目标。

整体流程

在实现Java JWT token失效时间的过程当中,步骤可以概括为以下几步:

步骤 说明
步骤1 添加依赖
步骤2 创建JWT工具类
步骤3 生成JWT Token
步骤4 验证JWT Token
步骤5 使用Token及处理过期情况

步骤详解

步骤1:添加依赖

在Java项目中使用JWT,首先需要引入相关的库。这里我们以Maven为例,在pom.xml中添加以下依赖:

<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt</artifactId>
    <version>0.9.1</version> <!-- 确保使用最新版本 -->
</dependency>
步骤2:创建JWT工具类

创建一个JWT工具类,用于生成和验证JWT Token。这个类服务于JWT的所有操作。

import io.jsonwebtoken.*;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

public class JwtUtils {

    private String secretKey = "yourSecretKey"; // 更换为你的密钥
    private long expirationTime = 3600000; // 设置Token失效时间为1小时

    // 生成Token的方法
    public String generateToken(String username) {
        Map<String, Object> claims = new HashMap<>();
        claims.put("username", username); // 将用户名放到claims中
        return Jwts.builder()
                .setClaims(claims) // 设置claims
                .setIssuedAt(new Date(System.currentTimeMillis())) // 设置当前时间
                .setExpiration(new Date(System.currentTimeMillis() + expirationTime)) // 设置失效时间
                .signWith(SignatureAlgorithm.HS256, secretKey) // 签名
                .compact(); // 创建Token
    }
}

在这段代码中:

  • secretKey 是用于签名的密钥,应该是复杂且独特的。
  • expirationTime 设定了Token的有效时长,这里设为1小时。
  • generateToken 方法接收用户名并创建新的Token。
步骤3:生成JWT Token

使用上面定义的JwtUtils类来生成Token。你可以在登录成功的地方调用这个方法。

public class AuthController {
    
    private JwtUtils jwtUtils = new JwtUtils();

    public String login(String username, String password) {
        // 这里通常会验证用户名和密码
        // 如果验证成功,就生成Token
        return jwtUtils.generateToken(username); // 生成JWT Token
    }
}
步骤4:验证JWT Token

为了确认Token的有效性,我们需要创建一个验证Token的方法。

public boolean validateToken(String token, String username) {
    String parsedUsername = extractUsername(token); // 从Token中提取用户名
    return (parsedUsername.equals(username) && !isTokenExpired(token)); // 校验
}

// 提取用户名的方法
public String extractUsername(String token) {
    return Jwts.parser().setSigningKey(secretKey).parseClaimsJws(token).getBody().get("username", String.class); // 提取用户名
}

// 判断Token是否失效
public boolean isTokenExpired(String token) {
    return Jwts.parser().setSigningKey(secretKey).parseClaimsJws(token).getBody().getExpiration().before(new Date()); // Token是否过期
}

在这里:

  • validateToken 方法用于验证Token的合法性和是否过期。
  • extractUsername 从Token中提取用户名。
  • isTokenExpired 方法用来判断Token是否已经失效。
步骤5:使用Token及处理过期情况

在应用程序中,您通常需要先验证Token再进行其他操作。

public void securedEndpoint(String token, String username) {
    if (validateToken(token, username)) {
        // Token有效,执行操作
        System.out.println("Token is valid, access granted.");
    } else {
        // Token无效或者过期
        System.out.println("Token is invalid or expired, access denied.");
    }
}

如果在调用 securedEndpoint 时提供了一个过期的Token,系统将阻止访问。

状态图

以下是生成Token、验证Token和失效处理流程的状态图:

stateDiagram
    [*] --> 提交请求
    提交请求 --> 生成Token
    生成Token --> Token有效
    生成Token --> Token无效
    Token有效 --> 访问资源
    Token无效 --> 拒绝访问

结尾

以上便是使用Java实现JWT Token设置失效时间的完整过程。通过这篇文章,你不仅学会了如何生成JWT Token,还了解了如何设置失效时间以及校验Token的有效性。

JWT在现代Web应用中的角色举足轻重,掌握它无疑是提升你开发能力的重要一步。希望这篇文章能够帮到你,让你在开发过程中顺利运用JWT进行身份验证和会话管理!如果还有其他疑问,随时可以问我!