** jwt验证小结**
1.生成token
HashMap<String, Object> map = new HashMap<>(); // 用于设置 header 信息
Calendar instance = Calendar.getInstance(); // 获取当前的日历
instance.add(Calendar.DATE, 7); // 设置日历为当前的 7 天后
Date date = instance.getTime(); // 将日历转化为 Date
// 创建 token
JWTCreator.Builder builder = JWT.create();
String token = builder.withHeader(map) // header
.withClaim("userId", 2001) // payload
.withClaim("username", "小明")
.withExpiresAt(date) // 设置过期时间
.sign(Algorithm.HMAC256("!@#SDA$!@#"));// signature
System.out.println(token);
2.根据令牌和签名解析数据
// 要验证的 token
String token =
"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHAiOjE2NTkzNDgwMjAsInVzZXJJZCI6MjAwMSwidXNlcm5hbWUiOiLlsI_mmI4ifQ.5Kmd5QLqgEYkAUh5m2Y22UPjlsH2jrr
// 要验证的 token
// 创建 JWT 验证对象
JWTVerifier jwtVerifier = JWT.require(Algorithm.HMAC256("!@#SDA$!@#")).build();
DecodedJWT decodedJWT = jwtVerifier.verify(token);
System.out.println(decodedJWT.getClaim("userId").asInt()); // 获取声明的 userId
System.out.println(decodedJWT.getClaim("username").asString()); // 获取声明的 username
System.out.println(decodedJWT.getExpiresAt()); // 获取过期时间
System.out.println(decodedJWT.getHeaderClaim("typ").asString()); // 获取标头的 tpy
System.out.println(decodedJWT.getHeaderClaim("alg").asString()); // 获取标头的 alg
System.out.println(decodedJWT.getType()); // 获取标头的 tpy
System.out.println(decodedJWT.getAlgorithm()); // 获取标头的 alg
System.out.println(decodedJWT.getHeader()); // 获取编码后的 header
System.out.println(decodedJWT.getPayload()); // 获取编码后的 payload
System.out.println(decodedJWT.getSignature()); // 获取编码后的 signature
System.out.println(decodedJWT.getToken()); // 获取编码后的 token
封装 JWT 工具类
public class JWTUtils {
private static final String SECRET = "#$#fdas!%";
/**
- 生成 token
*/
public static String getToken(HashMap<String, String> map){
Calendar instance = Calendar.getInstance();
instance.add(Calendar.DATE, 7); // 默认7天过期
// 创建 JTW builder
JWTCreator.Builder builder = JWT.create();
// payload
map.forEach((k, v)->{
builder.withClaim(k, v);
});
// 指定令牌过期时间
builder.withExpiresAt(instance.getTime());
// 签名
String token = builder.sign(Algorithm.HMAC256(SECRET));
return token;
} /**
- 验证并获取 token 信息
*/
public static DecodedJWT verify(String token){
JWTVerifier jwtVerifier = JWT.require(Algorithm.HMAC256(SECRET)).build();
DecodedJWT decodedJWT = jwtVerifier.verify(token);
return decodedJWT;
}
}
拦截器验证 token
public class JWTInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
HashMap<String, Object> map = new HashMap<>();
// 获取请求头中的的 token
String token = request.getHeader("token");
try {
DecodedJWT decodedJWT = JWTUtils.verify(token); // 验证令牌
return true; // 放行请求
} catch (SignatureVerificationException e) {
e.printStackTrace();
map.put("msg", "无效签名!");
} catch (TokenExpiredException e) {
e.printStackTrace();
map.put("msg", "token 过期!");
} catch (AlgorithmMismatchException e) {
e.printStackTrace();
map.put("msg", "token 算法不一致!");
} catch (Exception e) {
e.printStackTrace();
map.put("msg", "token 无效!");
}
map.put("state", false); // 设置状态码
// 将 map 转为 json
String json = new ObjectMapper().writeValueAsString(map);
response.setContentType("application/json;charset=utf-8");
response.getWriter().print(json);
return false;
}
}
在 config 包下创建 InterceptorConfig 类,并进行如下配置:
@Configuration
public class InterceptorConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new JWTInterceptor())
.addPathPatterns("") // 拦截的路径
.excludePathPatterns(""); // 放行的路径
}
}1.生成token
HashMap<String, Object> map = new HashMap<>(); // 用于设置 header 信息
Calendar instance = Calendar.getInstance(); // 获取当前的日历
instance.add(Calendar.DATE, 7); // 设置日历为当前的 7 天后
Date date = instance.getTime(); // 将日历转化为 Date
// 创建 token
JWTCreator.Builder builder = JWT.create();
String token = builder.withHeader(map) // header
.withClaim("userId", 2001) // payload
.withClaim("username", "小明")
.withExpiresAt(date) // 设置过期时间
.sign(Algorithm.HMAC256("!@#SDA$!@#"));// signature
System.out.println(token);
2.根据令牌和签名解析数据
// 要验证的 token
String token =
"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHAiOjE2NTkzNDgwMjAsInVzZXJJZCI6MjAwMSwidXNlcm5hbWUiOiLlsI_mmI4ifQ.5Kmd5QLqgEYkAUh5m2Y22UPjlsH2jrr
// 要验证的 token
// 创建 JWT 验证对象
JWTVerifier jwtVerifier = JWT.require(Algorithm.HMAC256("!@#SDA$!@#")).build();
DecodedJWT decodedJWT = jwtVerifier.verify(token);
System.out.println(decodedJWT.getClaim("userId").asInt()); // 获取声明的 userId
System.out.println(decodedJWT.getClaim("username").asString()); // 获取声明的 username
System.out.println(decodedJWT.getExpiresAt()); // 获取过期时间
System.out.println(decodedJWT.getHeaderClaim("typ").asString()); // 获取标头的 tpy
System.out.println(decodedJWT.getHeaderClaim("alg").asString()); // 获取标头的 alg
System.out.println(decodedJWT.getType()); // 获取标头的 tpy
System.out.println(decodedJWT.getAlgorithm()); // 获取标头的 alg
System.out.println(decodedJWT.getHeader()); // 获取编码后的 header
System.out.println(decodedJWT.getPayload()); // 获取编码后的 payload
System.out.println(decodedJWT.getSignature()); // 获取编码后的 signature
System.out.println(decodedJWT.getToken()); // 获取编码后的 token
封装 JWT 工具类
public class JWTUtils {
private static final String SECRET = "#$#fdas!%";
/**
- 生成 token
*/
public static String getToken(HashMap<String, String> map){
Calendar instance = Calendar.getInstance();
instance.add(Calendar.DATE, 7); // 默认7天过期
// 创建 JTW builder
JWTCreator.Builder builder = JWT.create();
// payload
map.forEach((k, v)->{
builder.withClaim(k, v);
});
// 指定令牌过期时间
builder.withExpiresAt(instance.getTime());
// 签名
String token = builder.sign(Algorithm.HMAC256(SECRET));
return token;
} /**
- 验证并获取 token 信息
*/
public static DecodedJWT verify(String token){
JWTVerifier jwtVerifier = JWT.require(Algorithm.HMAC256(SECRET)).build();
DecodedJWT decodedJWT = jwtVerifier.verify(token);
return decodedJWT;
}
}
拦截器验证 token
public class JWTInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
HashMap<String, Object> map = new HashMap<>();
// 获取请求头中的的 token
String token = request.getHeader("token");
try {
DecodedJWT decodedJWT = JWTUtils.verify(token); // 验证令牌
return true; // 放行请求
} catch (SignatureVerificationException e) {
e.printStackTrace();
map.put("msg", "无效签名!");
} catch (TokenExpiredException e) {
e.printStackTrace();
map.put("msg", "token 过期!");
} catch (AlgorithmMismatchException e) {
e.printStackTrace();
map.put("msg", "token 算法不一致!");
} catch (Exception e) {
e.printStackTrace();
map.put("msg", "token 无效!");
}
map.put("state", false); // 设置状态码
// 将 map 转为 json
String json = new ObjectMapper().writeValueAsString(map);
response.setContentType("application/json;charset=utf-8");
response.getWriter().print(json);
return false;
}
}
在 config 包下创建 InterceptorConfig 类,并进行如下配置:
@Configuration
public class InterceptorConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new JWTInterceptor())
.addPathPatterns("") // 拦截的路径
.excludePathPatterns(""); // 放行的路径
}
}