SpringMVC的AOP总结
1、Filter 过滤器
Filter是Servlet规范中规定的,只能用于WEB中, 在Servlet前后起作用
它可以对几乎所有请求进行过滤,但是缺点是一个过滤器实例只能在容器初始化时调用一次
使用场景: 修改字符编码; 对入参进行校验, 校验不通过返回错误信息.
原理: 基于函数回调( filterchain)的方式调用
2、Interceptor 拦截器
拦截器是Spring容器内的,是Spring框架支持的,可以使用Spring内的任何资源、对象
可以深入到方法的调用前后、异常抛出前后等深层次的程度做处理
缺点是只能对 Controller 请求进行拦截,对其他的一些比如直接访问静态资源的请求则没办法进行拦截处理
原理: 基于Java的反射机制,属于面向切面编程(AOP)的一种运用
使用场景: 对入参进行校验
3、RequestBodyAdvice
配合 @ControllerAdvice 和 @RequestBody 注解使用, 可以拦截所有的请求. 如果不使用 @RequestBody 修饰入参对象, 不会拦截
原理: AOP
使用场景: 参数的过滤,字符的编码,第三方的解密
4、ResponseBodyAdvice
拦截Controller方法默认返回参数,统一处理返回值/响应体
使用场景: 对控制层的返回结果进行加密
原理: AOP
5、AOP使用
面向切面编程,在程序开发中主要用来解决一些系统层面上的问题,比如日志,事务,权限等
使用场景: 统一记录控制层请求日志以及返回结果
用法总结
如果是拦截静态资源,需要使用过滤器;
如果是参数校验,可以使用拦截器实现;
如果对参数加解密,可以使用RequestBodyAdivce 和ResponseBodyAdvice;
如果是记录访问日志,可以使用 AOP.
拦截顺序是:filter—>Interceptor–>ControllerAdvice–>@Aspect -->Controller;
程序执行的顺序是先进过滤器,再进拦截器,最后进切面。注意:如果拦截器中preHandle方法返回的为false时,则无法进入切面.