Java JWT Token 设置过期时间

在现代应用开发中,身份验证和授权是至关重要的组成部分,尤其是在微服务架构和单页应用中。JSON Web Token (JWT) 是一种流行的身份验证方法,广泛用于客户端与服务器之间的安全信息传递。JWT 是一个包含编码 JSON 的字符串,用于安全地传输信息。本文将介绍如何在 Java 中创建 JWT,并设置其过期时间。

JWT 的基本结构

JWT 由三部分组成:

  1. 头部(Header):指定令牌的类型和签名算法。
  2. 载荷(Payload):包含与用户信息相关的声明(Claims)。
  3. 签名(Signature):用于验证消息的发送者并确保消息未被篡改。

JWT 的过期时间设置

在生成 JWT 时,你可以通过设置 exp 声明来定义过期时间。exp 是一个 Unix 时间戳,表示 JWT 何时过期。

Maven依赖

在开始之前,确保在你的 Maven 项目的 pom.xml 中添加 jjwt 库的依赖:

<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt</artifactId>
    <version>0.9.1</version>
</dependency>

代码示例

以下是一个简单的 Java 示例,展示如何生成带有过期时间的 JWT。

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;

import java.util.Date;

public class JwtUtil {

    private static final String SECRET_KEY = "mysecretkey";
    private static final long EXPIRATION_TIME = 1000 * 60 * 60; // 1 hour

    public static String generateToken(String username) {
        long currentTimeMillis = System.currentTimeMillis();

        return Jwts.builder()
                .setSubject(username)
                .setIssuedAt(new Date(currentTimeMillis))
                .setExpiration(new Date(currentTimeMillis + EXPIRATION_TIME))
                .signWith(SignatureAlgorithm.HS256, SECRET_KEY)
                .compact();
    }

    public static Claims validateToken(String token) {
        return Jwts.parser()
                .setSigningKey(SECRET_KEY)
                .parseClaimsJws(token)
                .getBody();
    }
}

代码解析

  1. 生成 JWT

    • setSubject(username):设置JWT的主体为用户名。
    • setIssuedAt:设置 JWT 创建时间。
    • setExpiration:设置 JWT 过期时间。
    • signWith:使用指定的算法和密钥进行签名。
  2. 验证 JWT

    • 使用 Jwts.parser() 方法解析令牌,并利用 setSigningKey 方法提供密钥,返回 Claims 对象。

状态图

在用户登录流程中,JWT 的状态变化可以表示为以下状态图:

stateDiagram
    [*] --> LoggedOut
    LoggedOut --> LoggedIn : Log In
    LoggedIn --> TokenIssued : JWT Created
    TokenIssued --> TokenValid : Token Valid
    TokenValid --> TokenExpired : Token Expired
    TokenExpired --> LoggedOut : Log Out

过期时间的设置与处理

设置过期时间后,客户端需要处理过期情况。一种常见的处理方式是使用刷新令牌(Refresh Token)来获取新的访问令牌。

状态 描述
用户登录 用户提供凭据,系统验证后返回 JWT
JWT 创建 系统生成 JWT,并设置过期时间
JWT 校验 客户端发送请求时附带 JWT,服务器校验 JWT 的有效性
JWT 过期 JWT 到达过期时间后,客户端需要使用 Refresh Token 进行新 Token 请求

总结

在 Java 应用中,使用 JWT 作为身份验证机制是一个非常流行且有效的方式。通过设置过期时间,可以增加系统的安全性,减少 token 被滥用的风险。本文中,我们介绍了如何生成带有过期时间的 JWT,并提供了相应的代码示例。希望这能帮助你更好地理解和使用 JWT。在实际应用中,建议根据需求调整过期时间的设定,并结合刷新令牌机制,提供良好的用户体验和系统安全性。