在Java应用中,利用JWT(JSON Web Tokens)实现token的生成与验证是一种广泛采用的技术方案,尤其适用于无状态认证架构。通过引入流行的Java JWT库,可以高效地完成token的签发和解析工作。
以下是一个基于Jwts工具类实现的token生成示例:
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import java.util.Date;
public class JwtUtils {
public static String generateToken(JwtUser jwtUser) {
// 定义token有效期为1小时
long expirationTime = 1000 * 60 * 60;
Date expireDate = new Date(System.currentTimeMillis() + expirationTime);
return Jwts.builder()
.setSubject(jwtUser.getUserName()) // 设置用户标识
.claim(CommonConstant.QW_USER_ID, jwtUser.getQwUserId()) // 添加自定义字段
.claim(CommonConstant.STAFF_NUMBER, jwtUser.getStaffNumber()) // 添加自定义字段
.setIssuedAt(new Date()) // 记录签发时间
.setExpiration(expireDate) // 设定过期时间
.signWith(SignatureAlgorithm.HS512, CommonConstant.JWT_SECRET_KEY) // 使用密钥签名
.compact();
}
}
jjwt
当用户成功登录后,系统可调用上述方法生成对应的token,并将该token返回给客户端。客户端需在后续每次请求中携带此token,以便服务端进行身份识别与权限校验。
服务端接收到请求时,可通过解析token获取其中包含的信息,进而判断请求的合法性。解析过程通常包括验证签名、检查过期时间等步骤。
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import java.util.Date;
public class JwtUtils {
public static String generateToken(JwtUser jwtUser) {
// 设置过期时间(1小时)
long expirationTime = 1000 * 60 * 60;
Date expireDate = new Date(System.currentTimeMillis() + expirationTime);
return Jwts.builder()
.setSubject(jwtUser.getUserName()) // 用户标识
.claim(CommonConstant.QW_USER_ID, jwtUser.getQwUserId()) // 自定义信息
.claim(CommonConstant.STAFF_NUMBER, jwtUser.getStaffNumber()) // 自定义信息
.setIssuedAt(new Date()) // 签发时间
.setExpiration(expireDate) // 过期时间
.signWith(SignatureAlgorithm.HS512, CommonConstant.JWT_SECRET_KEY) // 密钥
.compact();
}
}
token解析相关逻辑示意如下:
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureException;
public class JwtUtil {
private static final String SECRET_KEY = "mySecretKey"; // 确保与生成token时使用的密钥一致
public static Claims parseToken(String token) {
try {
return Jwts.parser()
.setSigningKey(SECRET_KEY)
.parseClaimsJws(token)
.getBody();
} catch (SignatureException e) {
// 签名不匹配,token无效
System.out.println("Invalid token");
} catch (Exception e) {
// 其他异常处理,例如token过期等
System.out.println("Token error: " + e.getMessage());
}
return null; // 如果解析失败返回null或者抛出异常根据需要处理
}
}
通过generateToken方法生成token后,可在客户端保存并随请求头传递。服务端则使用对应的解析机制对token进行处理,提取用户信息并执行权限控制等相关操作。
generateToken
在整个流程中,确保token的安全性至关重要。因此,建议使用强密钥(如HS512算法)、合理设置过期时间,并避免在token中存放敏感数据。
parseToken
以下是完整的工具类结构示意:



雷达卡


京公网安备 11010802022788号







