参数校验的几种方式
这里推荐几种方式,可用于参数校验,接口鉴权,令牌续命,版本号兼容过滤
一、基于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;
}
}
其中一个属性有值即可放行
一般都会加在消费者的controller层上,只要有该注解,就会校验参数。
注意:添加拦截器 springmvc拦截器
@Configuration
public class InterceptorConfig implements WebMvcConfigurer {
/**添加拦截器*/
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new ParamInterceptor