实现并使用一个注解需要实现四步:
1、创建注解
2、创建拦截器,拦截注解并处理
3、注册拦截器
4、使用注解
1、创建一个注解
@Target(ElementType.METHOD)
@Documented
@Retention(RetentionPolicy.RUNTIME)
public @interface TokenCheck {
boolean required() default true;
}
2、添加拦截器,实现HandlerInterceptor 接口
import com.msb.dongbao.common.base.annotations.TokenCheck;
import com.msb.dongbao.common.base.exceptions.TokenException;
import com.msb.dongbao.common.util.jwt.JwtUtil;
import org.apache.commons.lang3.StringUtils;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.lang.reflect.Method;
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.isEmpty(token)){
throw new TokenException("token 为空");
}
//获取对应的方法
HandlerMethod handlerMethod = (HandlerMethod) handler;
Method method = handlerMethod.getMethod();
//判断方法是否有TokenCheck注解
if (method.isAnnotationPresent(TokenCheck.class)) {
TokenCheck annotation = method.getAnnotation(TokenCheck.class);
//如果有注解,并且注解值为true,进行校验token
if(annotation.required()){
//校验touken
try{
JwtUtil.parseToken(token);
return true;
} catch (Exception e){
throw new TokenException("token 校验失败");
}
}
}
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
}
}
3、注册拦截器,实现WebMvcConfigurer ,并指定拦截的url和不拦截的url
import org.springframework.context.annotation.Bean;
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 InterceptorConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(authInterceptor())
.addPathPatterns("/**")
.excludePathPatterns("/ums-member/login")
.excludePathPatterns("/ums-member/reg")
.excludePathPatterns("/code/**");
}
@Bean
public AuthInterceptor authInterceptor(){
return new AuthInterceptor();
}
}
4、使用注解
@PostMapping("/updateUser")
@TokenCheck
public String updateUser(@RequestBody UserMemberDTO userMemberDTO){
return umsMemberService.updateUser();
}