@Target :设定注解的使用范围
ElementType.METHOD :只能使用在类的方法上
@Retention :定义被它注解的注解保留多久
RetentionPolicy.RUNTIME :不仅被保存在class文件中,jvm加载class文件后,仍然存在
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface TokenCheck {
//是否校验token
boolean required() default true;
}
public class TokenException extends Exception{
public TokenException(String message) {
super(message);
}
}
<dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> </dependency>StringUtils.isBlank() :是否为null,是否为"",是否为空字符串" "、制表符、换行符、换页符和回车,当不为空是返回false。
method.isAnnotationPresent(TokenCheck.class)
TokenCheck注解是否method上
method.getAnnotation(TokenCheck.class)
返回元素指定类型的注解
HandlerMethod handlerMethod = (HandlerMethod)handler;
Method method = handlerMethod.getMethod();获取拦截方法
public class AuthInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("拦截器进入");
String token = request.getHeader("token");
if(StringUtils.isBlank(token)){
throw new TokenException("token为空");
}
HandlerMethod handlerMethod = (HandlerMethod)handler;
Method method = handlerMethod.getMethod();
if(method.isAnnotationPresent(TokenCheck.class)){
TokenCheck annotation = method.getAnnotation(TokenCheck.class);
if(annotation.required()){
//校验token
try {
JwtUtil.parseToken(token);
return true;
}catch (Exception e){
throw new TokenException("token 异常");
}
}
}
return true;
}
}
@Configuration
public class InterceptorConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(authInterceptor())
.addPathPatterns("/**")
.excludePathPatterns("/user-member/login");
}
@Bean
public AuthInterceptor authInterceptor(){
return new AuthInterceptor();
}
}