Spring 过滤器 拦截器 AOP区别

简介
这几天在回顾Spring的AOP时,对过滤器,拦截器,AOP的关系有点好奇,故记录作以备份。在实现一些公共逻辑的时候,不少功能经过过滤器,拦截器,AOP都能实现,可是不一样的方式有不一样的效率。具体有什么区别,看下文描述。web

先后端交互基本逻辑

过滤器
过滤器拦截的是URL

Spring中自定义过滤器(Filter)通常只有一个方法,返回值是void,当请求到达web容器时,会探测当前请求地址是否配置有过滤器,有则调用该过滤器的方法(可能会有多个过滤器),而后才调用真实的业务逻辑,至此过滤器任务完成。过滤器并无定义业务逻辑执行前、后等,仅仅是请求到达就执行。后端

特别注意:过滤器方法的入参有request,response,FilterChain,其中FilterChain是过滤器链,使用比较简单,而request,response则关联到请求流程,所以能够对请求参数作过滤和修改,同时FilterChain过滤链执行完,而且完成业务流程后,会返回到过滤器,此时也能够对请求的返回数据作处理。post

拦截器
拦截器拦截的是URL

拦截器有三个方法,相对于过滤器更加细致,有被拦截逻辑执行前、后等。Spring中拦截器有三个方法:preHandle,postHandle,afterCompletion。分别表示以下性能

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

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已被渲染,执行拦截器的自定义处理。blog

AOP(面向切面)
面向切面拦截的是类的元数据(包、类、方法名、参数等)

相对于拦截器更加细致,并且很是灵活,拦截器只能针对URL作拦截,而AOP针对具体的代码,可以实现更加复杂的业务逻辑。具体类型参照其余博客。博客

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

相关文章
相关标签/搜索