安装JWT依赖#
1
2
3
4
5
| <dependency>
<groupId>com.auth0</groupId>
<artifactId>java-jwt</artifactId>
<version>4.5.0</version>
</dependency>
|
定义Jwt工具类#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
| package com.example.demo.utils;
import com.auth0.jwt.JWT;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.exceptions.JWTVerificationException;
import com.auth0.jwt.exceptions.SignatureVerificationException;
import com.auth0.jwt.exceptions.TokenExpiredException;
import com.auth0.jwt.interfaces.DecodedJWT;
import com.auth0.jwt.interfaces.JWTVerifier;
import org.springframework.stereotype.Component;
import java.util.Collections;
import java.util.Date;
import java.util.Map;
@Component
public class JwtUtils {
private static final String SECRET_KEY = "Pxiv0oevyL8rT3an11QKL208vYlkvAmt";
private static final String ISSUER = "admin_service";
private static final long EXPIRATION_TIME = 3600000;
public static String generateToken(Map<String, Object> claims) {
// 定义密钥
Algorithm algorithm = Algorithm.HMAC256(SECRET_KEY);
// 获取当前时间
Date now = new Date();
// 设置过期时间
Date expiration = new Date(now.getTime() + EXPIRATION_TIME);
// 构建JWT并添加所有自定义claim
com.auth0.jwt.JWTCreator.Builder tokenBuilder = JWT.create()
.withIssuer(ISSUER)
.withIssuedAt(now)
.withExpiresAt(expiration);
// 遍历添加每个自定义claim
if (claims != null && !claims.isEmpty()) {
for (Map.Entry<String, Object> entry : claims.entrySet()) {
String key = entry.getKey();
Object value = entry.getValue();
// 根据值类型选择对应的 withClaim 方法重载
if (value instanceof String) {
tokenBuilder.withClaim(key, (String) value);
} else if (value instanceof Integer) {
tokenBuilder.withClaim(key, (Integer) value);
} else if (value instanceof Long) {
tokenBuilder.withClaim(key, (Long) value);
} else if (value instanceof Boolean) {
tokenBuilder.withClaim(key, (Boolean) value);
} else if (value instanceof Double) {
tokenBuilder.withClaim(key, (Double) value);
} else if (value instanceof Float) {
tokenBuilder.withClaim(key, Collections.singletonList((Float) value));
} else if (value instanceof Short) {
tokenBuilder.withClaim(key, Collections.singletonList((Short) value));
} else if (value instanceof Byte) {
tokenBuilder.withClaim(key, Collections.singletonList((Byte) value));
} else if (value instanceof Enum<?>) {
tokenBuilder.withClaim(key, (Map<String, ?>) value);
}
}
}
return tokenBuilder.sign(algorithm);
}
public static Object validateToken(String token) {
try {
Algorithm algorithm = Algorithm.HMAC256(SECRET_KEY);
JWTVerifier verifier = JWT.require(algorithm)
.withIssuer(ISSUER)
.build();
DecodedJWT jwt = verifier.verify(token);
return "success";
} catch (SignatureVerificationException e) {
return "签名验证失败";
} catch (TokenExpiredException e) {
return "Token已过期";
} catch (JWTVerificationException e) {
return e.getLocalizedMessage();
}
}
}
|
定义JwtInterceptor#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
| package com.example.demo.config;
import cn.hutool.json.JSONUtil;
import com.example.demo.utils.JwtUtils;
import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class JwtInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String token = request.getHeader("Authorization");
if (token == null || "".equals(token)) {
response.setCharacterEncoding("UTF-8");
response.getWriter().write(JSONUtil.toJsonStr("未登录"));
return false;
}
Object result = JwtUtils.validateToken(token);
if ("success".equals(result)) {
return true;
} else {
response.setCharacterEncoding("UTF-8");
response.getWriter().write(JSONUtil.toJsonStr(result));
return false;
}
}
}
|
配置拦截器#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| package com.example.demo.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class WebAppConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new JwtInterceptor())
.addPathPatterns("/**") // 拦截所有请求,可根据实际需求调整路径模式
.excludePathPatterns("/login"); // 排除登录接口
}
}
|
使用JWT生成Token#
1
2
3
4
5
6
7
| Map<String, Object> claims = new HashMap<>();
claims.put("userId", userId);
claims.put("username", username);
// 其他自定义claim...
String token = JwtUtils.generateToken(claims);
return JSONUtil.toJsonStr(token);
|
这样你就完成了Spring Boot项目中JWT的集成和使用。记得根据你的项目实际情况对代码进行适当修改和扩展。