过滤器拦截器SpringAop

Posted 持续学习者

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了过滤器拦截器SpringAop相关的知识,希望对你有一定的参考价值。

过滤器:

过滤器是servlet提供的API,需要实现javax.servlet.Filter接口。过滤器可以拦截到方法的请求和响应(ServletRequest request, SetvletResponse response),并对请求响应做出的过滤操作,比如设置字符编码、鉴权操作。
过滤器方法的入参有request,response,FilterChain,其中FilterChain是过滤器链,使用比较简单,而request,response则关联到请求流程,因此可以对请求参数做过滤和修改,同时FilterChain过滤链执行完,并且完成业务流程后,会返回到过滤器,此时也可以对请求的返回数据做处理。

spring拦截器:

拦截器是spring提供的API,需要实现 org.springframework.web.servlet.HandlerInterceptor接口
拦截器拦截的是URL,获取请求中的参数信息比较麻烦;
拦截器有三个方法,相对于过滤器更加细致,有被拦截逻辑执行前、后等。

Spring中拦截器有三个方法:preHandle,postHandle,afterCompletion。分别表示如下

public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o)表示被拦截的URL对应的方法执行前的自定义处理

public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView)表示此时还未将modelAndView进行渲染,被拦截的URL对应的方法执行后的自定义处理,。

public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e)表示此时modelAndView已被渲染,执行拦截器的自定义处理。

AOP:

AOP操作可以对方法(spring管理的bean)进行横向的拦截,最大的优势在于可以获取执行方法的参数,对方法进行统一的处理,常见使用日志,事务,请求参数安全验证等。

三者使用场景类似
从过滤器--》拦截器--》切面,拦截规则越来越细致,执行顺序依次是过滤器、拦截器、切面。
一般情况下数据被过滤的时机越早对服务的性能影响越小,因此我们在编写相对比较公用的代码时,优先考虑过滤器,然后是拦截器,最后是aop。
比如权限校验,一般情况下,所有的请求都需要做登陆校验,此时就应该使用过滤器在最顶层做校验;日志记录,一般日志只会针对部分逻辑做日志记录,
而且牵扯到业务逻辑完成前后的日志记录,因此使用过滤器不能细致地划分模块,此时应该考虑拦截器,
然而拦截器也是依据URL做规则匹配,因此相对来说不够细致,因此我们会考虑到使用AOP实现,AOP可以针对代码的方法级别做拦截,很适合日志功能。

以上是关于过滤器拦截器SpringAop的主要内容,如果未能解决你的问题,请参考以下文章

servlet,过滤器,监听器,拦截器的区别

Jaeger-Opentracing的Java-client

Spring AOP深入理解之拦截器调用

Ehcache学习ehcache与springAOP拦截器实例

SpringAOP拦截器的代理机制

Ehcache学习ehcache与springAOP拦截器实例