项目方案:Java 如何判断 Token 有效期

1. 项目简介

本项目旨在提供一种基于 Java 的方法来判断 Token 的有效期。Token 是一种用于身份验证和授权的令牌,它通常包含一定的有效期,超过有效期后将失效,需要重新获取新的 Token。

2. 技术选型

本项目将采用以下技术进行开发:

  • 后端框架:Spring Boot
  • 身份验证和授权:JSON Web Token(JWT)
  • 数据库:MySQL

3. 方案设计

本项目的方案设计如下:

3.1 Token 生成

使用 JWT 来生成 Token,并将 Token 保存在服务器端和客户端。Token 中需要包含用户的相关信息以及 Token 的有效期。

以下是生成 Token 的 Java 代码示例:

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

import java.util.Date;

public class TokenUtils {

    private static final String SECRET_KEY = "your_secret_key";
    private static final long EXPIRATION_TIME = 864_000_000; // 10 days

    public static String generateToken(String username) {
        Date now = new Date();
        Date expiration = new Date(now.getTime() + EXPIRATION_TIME);

        return Jwts.builder()
                .setSubject(username)
                .setIssuedAt(now)
                .setExpiration(expiration)
                .signWith(SignatureAlgorithm.HS512, SECRET_KEY)
                .compact();
    }
}

3.2 Token 验证

在每次需要验证 Token 的接口中,使用拦截器或过滤器来检查 Token 的有效性。验证过程包括以下几个步骤:

  1. 从请求头或请求参数中获取 Token;
  2. 使用 JWT 解析 Token,并从中获取用户信息;
  3. 验证 Token 的有效期是否已过期。

以下是验证 Token 的 Java 代码示例:

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

import javax.servlet.http.HttpServletRequest;
import java.util.Date;

public class TokenUtils {

    // ...

    public static String getUsernameFromToken(String token) {
        Claims claims = Jwts.parser()
                .setSigningKey(SECRET_KEY)
                .parseClaimsJws(token)
                .getBody();

        return claims.getSubject();
    }

    public static boolean isTokenExpired(String token) {
        Claims claims = Jwts.parser()
                .setSigningKey(SECRET_KEY)
                .parseClaimsJws(token)
                .getBody();

        Date expiration = claims.getExpiration();
        return expiration.before(new Date());
    }

    public static String getTokenFromRequest(HttpServletRequest request) {
        String token = request.getHeader("Authorization");
        if (token != null && token.startsWith("Bearer ")) {
            return token.substring(7);
        }
        return null;
    }
}

3.3 Token 刷新

在 Token 快要过期时,提供一个接口用于刷新 Token。接口接收旧 Token,并生成一个新的 Token,将旧 Token 设置为失效。

以下是刷新 Token 的 Java 代码示例:

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

import java.util.Date;

public class TokenUtils {

    // ...

    public static String refreshToken(String oldToken) {
        String username = getUsernameFromToken(oldToken);
        return generateToken(username);
    }
}

4. 数据库设计

本项目将使用 MySQL 数据库来存储用户的相关信息和 Token。

以下是用户表的设计:

字段名 类型 说明
id INT 用户 ID
username VARCHAR 用户名
password VARCHAR 密码
token VARCHAR 用户 Token

5. 类图设计

以下是本项目的类图设计,使用 Mermaid 语法表示:

classDiagram
    class TokenUtils {
        - SECRET_KEY: String
        - EXPIRATION_TIME: long
        + generateToken(username: String): String
        + getUsernameFromToken(token: String): String
        + isTokenExpired(token: String): boolean
        + getTokenFromRequest(request: HttpServletRequest): String
        + refreshToken(oldToken: String): String
    }

6. 总结

本项目提供了一种基于 Java 的方法来判断 Token 的有效期。通过使用 JWT 来生成和验证 Token,并结合数据库来存储用户信息和 Token,可以实现身份验证和授权的功能。本项目还提供了 Token 的刷新机制,避免了频繁重新获取 Token。

通过该方案,我们可以