项目方案: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 的有效性。验证过程包括以下几个步骤:
- 从请求头或请求参数中获取 Token;
- 使用 JWT 解析 Token,并从中获取用户信息;
- 验证 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。
通过该方案,我们可以