有关jwt验证小结

124 阅读1分钟

** 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(""); // 放行的路径

}

}