码迷,mamicode.com
首页 > 编程语言 > 详细

SSM开发 | 对 SpringMVC 传入参数 进行参数校验 (使用自定义AOP切面+自定义参数注解)

时间:2018-03-02 22:04:49      阅读:1026      评论:0      收藏:0      [点我收藏+]

标签:type   map   数据   interface   arraylist   效率   ++   img   except   

1.提要

  本文是 小小商城-SSM版的 细节详解系列 之一,项目 github:https://github.com/xenv/S-mall-ssm 本文代码大部分在 github 中 可以找到。

  参数校验就是对用户 GET 或者 POST 传进来的参数进行校验是否合法。最简单的方法就是在每个控制器方法中,一个一个用 if 校验,但是这样效率很低。

  那么,还有没有别的方法呢?SpringMVC官方推荐是使用 hibernate-validate 校验框架,但是使用起来可以说是很麻烦了,还要针对 每个 实体,再写校验器,工作量巨大。

  在此,我用 自定义AOP切面 的方法,结合 自定义参数注解,非常方便的就实现了简单的参数校验(这里以非空校验为例),实现的效果如下:

    @RequestMapping("search")
    public String search(String keyword, @Nullable String sort, Model model) throws Exception {
  }

  对于 sort 参数,访问的时候可能并不一定会传进来,我们使用 @Nullable 进行标记(这个是我们定义的注解),否则将默认进行 非 null 检测,这样就可以大大减少空指针错误发生的几率。

  有些朋友可能会问,为什么不使用SpringMVC的拦截器,而是要用 AOP 的方法呢,这里我画个图给大家解释一下:

  技术分享图片

  如果是用拦截器,拦截器会在函数调用前就拦截,这样我们就没有办法做数据校验了,而AOP切点则在函数调用后,函数体调用前可以拦截,那么我们用AOP做校验就非常合适。

2.具体实现

  1.定义参数注解 (这里我只弄了个 Nullable 可空,其他不加这个默认非空)

@Retention(RetentionPolicy.RUNTIME)
@Target({PARAMETER})
public @interface Nullable {

}

  2. 配置AOP

  具体的不展开讲了,网上很多,Maven两个依赖,Spring和SpringMVC都要加配置,还要加XML的域,就基本配置好了

  3. 编写AOP切面

  VerificationAspect.java

@Aspect
@Component
public class VerificationAspect {
    /**
     * 声明切面 应用在,所有 Controller下的, 以Controller结尾的类中的,所有 public 方法
     */
    @Pointcut("execution(public * tmall.controller.*.*Controller.*(..))")
    public void joinPointInAllController() {
    }

    /**
     * 切入点执行前方法
     *
     * @param point 切入点
     */
    @Before("joinPointInAllController()")
    public void checkParameter(JoinPoint point) throws ParameterException {
        // 获得切入方法参数
        Object[] args = point.getArgs();
        // 获得切入的方法
        Method method = ((MethodSignature) point.getSignature()).getMethod();
        // 获得所有参数
        Parameter[] parameters = method.getParameters();
        // 保存需要校验的args
        ArrayList<Object> argsWithoutNullable = new ArrayList<>();
        // 对没有Nullable注解的参数进行非空校验
        for (int i = 0; i < parameters.length; i++) {
            Parameter parameter = parameters[i];
            Annotation[] annotations = parameter.getDeclaredAnnotationsByType(Nullable.class);
            if (annotations.length < 1) {
                argsWithoutNullable.add(args[i]);
            }
        }
        for (Object o : argsWithoutNullable) {
            if (o == null) {
                throw new ParameterException("非法请求,参数不全");
            }
        }
    }
}

  OK,其实非常简单了。

SSM开发 | 对 SpringMVC 传入参数 进行参数校验 (使用自定义AOP切面+自定义参数注解)

标签:type   map   数据   interface   arraylist   效率   ++   img   except   

原文地址:https://www.cnblogs.com/bukong/p/ssm-aop-verification.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!