Java优雅的实现参数校验

参数校验的几种方式

这里推荐几种方式,可用于参数校验,接口鉴权,令牌续命,版本号兼容过滤

一、基于AOP环绕通知

aop/切面类

/**
 * @Description 基于AOP的环绕通知 控制层的方法进行匹配 校验全部参数
 * @author kz
 * @date 2022/10/17
 */
@Component //IOC创建容器
@Aspect  //切面
public class ParamAspect {
   
    // 切入点                                     类 方法 参数
     语法格式:execution(* 包名.类名.⽅法名(..))
    @Pointcut("execution(* com.auth.api.controller.*.*(..))")
    public void pt(){
   }

    @Around("pt()")
    public Object handler(ProceedingJoinPoint point)throws Throwable{
   
        //1.获取当前方法上的参数
        Object[] args = point.getArgs();
        //2.遍历循环,进行校验参数
        for (Object o:args){
   
            if (Objects.isNull(o)){
   
                //空参,失败
                return R.fail("参数为空");
            }
        }
        //3.执行原来的方法
        return point.proceed();
    }
}

二、基于注解+拦截器实现

2.0 参数校验

1.annotation/注解类

/**自定义注解 标记是否进行参数校验,修饰方法*/
@Retention(RetentionPolicy.RUNTIME)//定义注解运行时有效性
@Target(value = ElementType.METHOD)//定义注解的使用范围
public @interface CheckParam {
   
}

2.拦截器

/**
 * 基于注解+拦截器,实现参数的校验
 * @author kz
 * @date 2022/10/17
 */
public class ParamInterceptor implements HandlerInterceptor {
   
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
   
        //1.获取当前执行的方法
        if(handler instanceof HandlerMethod) {
   
            HandlerMethod method = (HandlerMethod) handler;
            //2.获取方法上的自定义注解
            if (method.hasMethodAnnotation(CheckParam.class)) {
   
                //3.存在 获取参数 进行校验
                Map<String, String[]> params = request.getParameterMap();
                //     该方法返回map中所有key值的列表
                for (String s : params.keySet()) {
   
                    if (params.get(s)[0] == null) {
   
                        System.err.println(s);
                        //判断第一个值 就可以 如果为空就拦截处理
                        //校验不通过拦截
                        response.setContentType("application/json;charset=UTF-8");
                        response.getWriter().println(JSON.toJSONString(R.fail()));
                        return false;
                    }
                }
            }
        }
        //校验通过放行
        return true;
    }
}

其中一个属性有值即可放行
image-20230316231406026
一般都会加在消费者的controller层上,只要有该注解,就会校验参数。
注意:添加拦截器 springmvc拦截器

@Configuration
public class InterceptorConfig implements WebMvcConfigurer {
   
    /**添加拦截器*/
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
   
        registry.addInterceptor(new ParamInterceptor
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Kkkouz

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值