美文网首页
自定义注解 利用反射解析

自定义注解 利用反射解析

作者: 万物皆有序和公式 | 来源:发表于2021-05-19 13:14 被阅读0次
    Retention(RetentionPolicy.RUNTIME)
    @Target(ElementType.METHOD)
    public @interface AccessLimit {
    
        int second();
    
        int maxCount();
    
        boolean needLogin() default true;
    }
    
    @Component
    public class AccessLimitInterceptor implements HandlerInterceptor {
    
        @Autowired
        private IUserService userService;
        @Autowired
        private RedisTemplate redisTemplate;
    
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
            if (handler instanceof HandlerMethod) {
                User user = getUser(request, response);
                UserContext.setUser(user);
                HandlerMethod hm = (HandlerMethod) handler;
                AccessLimit accessLimit = hm.getMethodAnnotation(AccessLimit.class);
                if (accessLimit == null) {
                    return true;
                }
                int second = accessLimit.second();
                int maxCount = accessLimit.maxCount();
                boolean needLogin = accessLimit.needLogin();
                String key = request.getRequestURI();
                if (needLogin) {
                    if (user == null) {
                        render(response, RespBeanEnum.SESSION_ERROR);
                        return false;
                    }
                    key += ":" + user.getId();
                }
                ValueOperations valueOperations = redisTemplate.opsForValue();
                Integer count = (Integer) valueOperations.get(key);
                if (count == null) {
                    valueOperations.set(key, 1, second, TimeUnit.SECONDS);
                } else if (count < maxCount) {
                    valueOperations.increment(key);
                } else {
                    render(response, RespBeanEnum.ACCESS_LIMIT_REAHCED);
                    return false;
                }
            }
            return true;
        }
    
    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    public class GlobalException extends RuntimeException {
        private RespBeanEnum respBeanEnum;
    }
    
    @RestControllerAdvice
    public class GlobalExceptionHandler {
    
        @ExceptionHandler(Exception.class)
        public RespBean ExceptionHandler(Exception e) {
            if (e instanceof GlobalException) {
                GlobalException ex = (GlobalException) e;
                return RespBean.error(ex.getRespBeanEnum());
            } else if (e instanceof BindException) {
                BindException ex = (BindException) e;
                RespBean respBean = RespBean.error(RespBeanEnum.BIND_ERROR);
                respBean.setMessage("参数校验异常:" + ex.getBindingResult().getAllErrors().get(0).getDefaultMessage());
                return respBean;
            }
            return RespBean.error(RespBeanEnum.ERROR);
        }
    
    }
    
    @Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE })
    @Retention(RUNTIME)
    @Documented
    @Constraint(validatedBy = {IsMobileValidator.class})
    public @interface IsMobile {
    
        boolean required() default true;
    
        String message() default "手机号码格式错误";
    
        Class<?>[] groups() default { };
    
        Class<? extends Payload>[] payload() default { };
    }
    
    public class IsMobileValidator implements ConstraintValidator<IsMobile,String> {
    
        private boolean required = false;
    
        @Override
        public void initialize(IsMobile constraintAnnotation) {
            required = constraintAnnotation.required();
        }
    
        @Override
        public boolean isValid(String value, ConstraintValidatorContext context) {
            if (required){
                return ValidatorUtil.isMobile(value);
            }else {
                if (StringUtils.isEmpty(value)){
                    return true;
                }else {
                    return ValidatorUtil.isMobile(value);
                }
            }
        }
    }
    

    相关文章

      网友评论

          本文标题:自定义注解 利用反射解析

          本文链接:https://www.haomeiwen.com/subject/eddddltx.html