自定义注解的使用
1.通过@interface 来标识这是一个自定义注解
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
public @interface LoginToken {
}
2.在定义好过后,通过去实现 HandlerMethodArgumentResolver类,重写 supportsParameter方法和resolveArgument方法。
-
public boolean supportsParameter(MethodParameter parameter) { // TODO Auto-generated method stub return parameter.getParameterType().isAssignableFrom(SysUser.class) && parameter.hasParameterAnnotation(LoginToken.class); }
参数校验拦截,在满足所需要的条件过后,进行放行,走resolveArgument方法
-
public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception { // TODO Auto-generated method stub Object sysUseroid = webRequest.getHeader("api_key"); if(sysUseroid == null){ throw new CustomException(-1,"用户信息不存在"); } Claims claimByToken = JwtUtils.getInstance().getClaimByToken(sysUseroid.toString()); if(claimByToken == null || JwtUtils.getInstance().isTokenExpired(claimByToken.getExpiration())){ throw new CustomException(ResultCodeEnum.Expire_TOKEN); } String subject = claimByToken.getSubject(); Object o = redisUtil.get(TokenCacheConst.TOKEN_USER_INFO + "::" + subject); if(EmptyUtil.isEmpty(o)){ return null; } SysUser user = new SysUser(); user.setUserId(Long.valueOf(subject)); BeanUtils.copyProperties(o,user); return user; }
在通过参数校验后,对其进行后置处理。
3.托付给Spring管理
实现WebMvcConfigurer类
@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
log.info("加载用户数据");
argumentResolvers.add(loginHandlerMethodArgumentResolver);
}