引入jwt
在pom.xml中引入jwt
<dependencies>
<!-- 引入JWT -->
<dependency>
<groupId>com.auth0</groupId>
<artifactId>java-jwt</artifactId>
<version>3.4.0</version>
</dependency>
</dependencies>
之后刷新项目
封装jwt工具类
public class JWTUtil {
// 用于JWT进行签名加密的秘钥
private static String SECRET = "code-duck-*%#@*!&";
/**
* @Param: 传入需要设置的payload信息
*
* @return: 返回token
*/
public static String generateToken(Map<String, String> map, Date date) {
JWTCreator.Builder builder = JWT.create();
// 将map内的信息传入JWT的payload中
map.forEach((k, v) -> {
builder.withClaim(k, v);
});
//设置过期时间
builder.withExpiresAt(date);
// 设置签名并返回token
return builder.sign(Algorithm.HMAC256(SECRET)).toString();
}
/**
* @Param: 传入token
* @return:
*/
public static DecodedJWT getToken(String token) {
return JWT.require(Algorithm.HMAC256(SECRET)).build().verify(token);
}
}
先简单的对token的生成和校验进行简单的封装
token的生成与解密
// 设置JWT令牌的过期时间为60
Calendar instance = Calendar.getInstance();
instance.add(Calendar.SECOND, 60);
Map<String, String> map = new HashMap<>();
map.put("account", "admin");
//生成一个token,里面包含了用户的账户
String token = JWTUtil.generateToken(map,instance.getTime());
//token解密,可获取用户账户
String account = JWTUtil.getToken(token).getClaim("account").asString();
封装一个拦截器校验token
public class JwtInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String token = request.getHeader("token");
HashMap<String, String> map = new HashMap<>();
try {
JWTUtil.getToken(token);//验证令牌
return true;//放行请求
} catch (SignatureVerificationException e) {
map.put("msg", "无效签名!");
} catch (TokenExpiredException e) {
map.put("msg", "token过期!");
} catch (AlgorithmMismatchException e) {
map.put("msg", "token算法不一致!");
} catch (Exception e) {
map.put("msg", "token无效!!");
}
map.put("code", "403");//设置状态
//将 map 转为json jackson
String json = new ObjectMapper().writeValueAsString(map);
response.setContentType("application/json;charset=UTF-8");
response.getWriter().println(json); //前台返回数据
return false;
}
}
这里token校验失败都会抛出异常,我们只需要捕获异常进行处理就行了。
应用自定义的拦截器
@Configuration
public class InterceptoConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new JwtInterceptor()) //注册自定义拦截器
.addPathPatterns("/**") //拦截所有路径
.excludePathPatterns("/api/user/login"); //排除登陆请求
}
}
我们先拦截所有的接口,只开放出登陆的接口,登陆的接口返回token,后面请求其他的接口的时候,都要将token设置在请求头里,只有认证了才能通过。