文章目录

  • 一、过滤器(Filter)
    • 1.1 简介
    • 1.2 应用场景
    • 1.3 源码分析
  • 二、拦截器(Interceptor)
    • 2.1 简介
    • 2.2 应用场景
    • 2.2 源码分析
  • 三、面向切面编程(AOP)
    • 3.1 简介
    • 3.2 应用场景
    • 3.3 AOP术语
  • 四、三者对比
  • 五、参考文献

一、过滤器(Filter)

1.1 简介

过滤器拦截的是URL

Java的过滤器能够为我们提供系统级别的过滤,也就是说,能过滤所有的web请求,这一点,是拦截器无法做到的。

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

请求执行流程如下图:

1.2 应用场景

  • 自动登录
  • 统一设置编码格式
  • 访问权限控制
  • 敏感字符过滤等

1.3 源码分析

public interface Filter {public void init(FilterConfig filterConfig) throws ServletException;public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException;public void destroy();
}

过滤器方法的入参有request,response,FilterChain,其中FilterChain是过滤器链,使用比较简单,而request,response则关联到请求流程,因此可以对请求参数做过滤和修改,同时FilterChain过滤链执行完,并且完成业务流程后,会返回到过滤器,此时也可以对请求的返回数据做处理(如果Filter的urlPatterns设置为“/*”的话,doFilter()方法会执行两次,向服务器发起请求执行一次,服务器返回结果再执行一次)。

urlPatterns
配置要拦截的资源

  1. 以指定资源匹配。例如"/index.jsp"
  2. 以目录匹配。例如"/servlet/*"
  3. 以后缀名匹配。例如"*.jsp"
  4. 通配符,拦截所有web资源。"/*"

二、拦截器(Interceptor)

2.1 简介

拦截器只能拦截部分web请求(URL)。(拦截器是基于反射机制实现的,拦截的对象只能是实现了接口的类,而不能拦截url这种连接)

Java里的拦截器提供的是非系统级别的拦截,也就是说,就覆盖面来说,拦截器不如过滤器强大,但是更有针对性。Java中的拦截器是基于Java反射机制实现的,更准确的划分,是基于JDK实现的动态代理。

单个拦截器执行流程:

  1. 程序先执行preHandle()方法,如果该方法的返回值为true,则程序会继续向下执行处理器中的方法,否则将不再向下执行。
  2. 在业务处理器(即控制器Controller类)处理完请求后,会执行postHandle()方法,然后会通过DispatcherServlet向客户端返回响应。
  3. 在DispatcherServlet处理完请求后,才会执行afterCompletion()方法。

多个拦截器执行流程:

  1. 当有多个拦截器同时工作时,它们的preHandle()方法会按照配置文件中拦截器的配置顺序执行,而它们的postHandle()方法和afterCompletion()方法则会按照配置顺序的反序执行。

2.2 应用场景

  • 日志记录:记录请求信息的日志
  • 权限检查:如登录检查
  • 性能检测:检测方法的执行时间

2.2 源码分析

public interface HandlerInterceptor {default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {return true;}default void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {}default void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {}
}
  1. preHandle() 方法:该方法会在控制器方法前执行,其返回值表示是否中断后续操作。当其返回值为true时,表示继续向下执行;当其返回值为false时,会中断后续的所有操作(包括调用下一个拦截器和控制器类中的方法执行等)。
  2. postHandle()方法:该方法会在控制器方法调用之后,且解析视图之前执行。可以通过此方法对请求域中的模型和视图做出进一步的修改。
  3. afterCompletion()方法:该方法会在整个请求完成,即视图渲染结束之后执行。可以通过此方法实现一些资源清理、记录日志信息等工作。

在Spring框架中,我们可以直接继承HandlerInterceptorAdapter.java这个抽象类,来实现我们自己的拦截器。

三、面向切面编程(AOP)

3.1 简介

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

相对于拦截器更加细致,而且非常灵活,拦截器只能针对URL做拦截,而AOP针对具体的代码,能够实现更加复杂的业务逻辑。

AOP是对OOP的一种补充和完善,将代码中重复的工作抽取出来成为一个切面,减少代码的耦合性,例如事务、日志。

3.2 应用场景

  • 事务控制
  • 异常处理
  • 打印日志等

3.3 AOP术语

  1. 方面(Aspect):一个关注点的模块化,这个关注点实现可能另外横切多个对象。事务管理是J2EE应用中一个很好的横切关注点例子。方面用Spring的Advisor或拦截器实现。
  2. 连接点(Joinpoint):程序执行过程中明确的点,如方法的调用或特定的异常被抛出。
  3. 通知(Advice):在特定的连接点,AOP框架执行的动作。各种类型的通知包括“around”、“before”和“throws”通知。通知类型将在下面讨论。许多AOP框架包括Spring都是以拦截器做通知模型,维护一个“围绕”连接点的拦截器链。
  4. 切入点(Pointcut):指定一个通知将被引发的一系列连接点的集合。AOP框架必须允许开发者指定切入点,例如,使用正则表达式。
  5. 引入(Introduction):添加方法或字段到被通知的类。Spring允许引入新的接口到任何被通知的对象。例如,你可以使用一个引入使任何对象实现IsModified接口,来简化缓存。
  6. 目标对象(Target Object):包含连接点的对象,也被称作被通知或被代理对象。
  7. AOP代理(AOP Proxy):AOP框架创建的对象,包含通知。在Spring中,AOP代理可以是JDK动态代理或CGLIB代理。
  8. 编织(Weaving):组装方面来创建一个被通知对象。这可以在编译时完成(例如使用AspectJ编译器),也可以在运行时完成。Spring和其他纯Java AOP框架一样,在运行时完成织入。

各种通知类型包括:

  1. Around通知:包围一个连接点的通知,如方法调用。这是最强大的通知。Aroud通知在方法调用前后完成自定义的行为,它们负责选择继续执行连接点或通过返回它们自己的返回值或抛出异常来短路执行。
  2. Before通知:在一个连接点之前执行的通知,但这个通知不能阻止连接点前的执行(除非它抛出一个异常)。
  3. AfterThrowing通知:在方法抛出异常时执行的通知。Spring提供强制类型的Throws通知,因此你可以书写代码捕获感兴趣的异常(和它的子类),不需要从Throwable或Exception强制类型转换。
  4. AfterReturning通知:在连接点正常完成后执行的通知,例如,一个方法正常返回,没有抛出异常。

如同AspectJ,Spring提供所有类型的通知,推荐使用最为合适的通知类型来实现需要的行为。例如,如果只是需要用一个方法的返回值来更新缓存,最好实现一个AfterReturning通知,而不是Around通知,虽然Around通知也能完成同样的事情。使用最合适的通知类型使编程模型变得简单,代码可读性更高,并能减少潜在错误。

四、三者对比

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

Spring的拦截器与Servlet的Filter有相似之处,比如二者都是AOP编程思想的体现,都能实现权限检查、日志记录等。不同的是:

  1. 使用范围不同:Filter是Servlet规范规定的,只能用于Web程序中。而拦截器既可以用于Web程序,也可以用于Application、Swing程序中。
  2. 规范不同:Filter是在Servlet规范中定义的,是Servlet容器支持的。而拦截器是在Spring容器内的,是Spring框架支持的。
  3. 使用的资源不同:同其他的代码块一样,拦截器也是一个Spring的组件,归Spring管理,配置在Spring文件中,因此能使用Spring里的任何资源、对象,例如Service对象、数据源、事务管理等,通过IOC注入到拦截器即可;而Filter则不能。
  4. 深度不同:
    • Filter在只在Servlet前后起作用。实际上Filter和Servlet极其相似,区别只是Filter不能直接对用户生成响应。实际上Filter里doFilter()方法里的代码就是从多个Servlet的service()方法里抽取的通用代码,通过使用Filter可以实现更好的复用。Filter是一个可以复用的代码片段,可以用来转换Http请求、响应和头信息。Filter不像Servlet,它不能产生一个请求或者响应,它只是修改对某一资源的请求,或者修改从某一资源的响应。
    • 而拦截器能够深入到方法前后、异常抛出前后等,因此拦截器的使用具有更大的弹性。所以在Spring构架的程序中,要优先使用拦截器。
    • AOP相对于拦截器更加细致,而且非常灵活,拦截器只能针对URL做拦截,而AOP针对具体的代码,能够实现更加复杂的业务逻辑。

五、参考文献

  • 拦截器(Interceptor)与过滤器(Filter)的区别
  • Spring 过滤器 拦截器 AOP区别
  • Spring MVC-拦截器
  • Java Web之过滤器(Filter)

过滤器、拦截器和AOP的分析与对比相关推荐

  1. 过滤器,拦截器,aop 比较

    Filter过滤器 过滤器拦截web访问url地址. 严格意义上讲,filter只是适用于web中,依赖于Servlet容器,利用Java的回调机制进行实现. Filter过滤器:和框架无关,可以控制 ...

  2. SpringBoot的过滤器拦截器AOP和异常处理器

    目录 前言 过滤器 创建过滤器 拦截器 创建拦截器 配置拦截器 AOP 创建AOP 异常处理器 创建异常处理器 测试请求的执行过程 创建接口 发送请求 前言 过滤器.拦截器.AOP.异常处理器是搭建系 ...

  3. 过滤器、拦截器、AOP、ControllerAdvcie的使用对比、执行顺序及代码教程

    文章目录 前言 过滤器Filter 简介 使用方法 代码实现 测试 拦截器Interceptor 简介 使用方法 代码实现 测试 ControllerAdvice 简介 使用方法 代码实现 测试 AO ...

  4. 还不了解后端资源拦截和权限认证?过滤器,拦截器,AOP,SpringSecurity教教你

    一.过滤器 过滤器实际上就是对web资源进行拦截,做一些处理后再交给下一个过滤器或servlet处理 通常都是用来拦截request进行处理的,也可以对返回的response进行拦截处理 Filter ...

  5. token拦截器阻止连接_如何防止广告拦截器阻止您的分析数据

    token拦截器阻止连接 TL;DR There's dataunlocker.com service coming soon (subscribe!), along with the open-so ...

  6. 过滤器 拦截器 区别

    转 http://www.cnblogs.com/wangyuyu/archive/2013/07/02/3167354.html 1.拦截器是基于java的反射机制的,而过滤器是基于函数回调 2.过 ...

  7. java web 过滤器 拦截器 监听器_Java中的拦截器和过滤器,可不是同一个东西

    过滤器(Filter) 过滤器就如上面的水质过滤器一样,把管道中的水进行一遍过滤再使用.过滤器基于filter接口中的doFilter回调函数,主要的用途是设置字符集.控制权限.控制转向.做一些业务逻 ...

  8. Spring Boot 系列:过滤器+拦截器+监听器

    原 Swagger 文章合并到 Spring Boot 系列:配置 Swagger2 一.过滤器 - Filter 过滤器是处于客户端和服务器资源文件之间的一道过滤网,帮助我们过滤掉一些不符合要求的请 ...

  9. MyBatis拦截器有哪些以及分析

    MyBatis提供了一种插件(plugin)的功能,虽然叫做插件,但其实这是拦截器功能.那么拦截器拦截MyBatis中的哪些内容呢? 我们进入官网看一看: MyBatis 允许你在已映射语句执行过程中 ...

最新文章

  1. win10安装jdk1.8
  2. 自制javascript库
  3. python异常处理机制的好处_浅谈Python异常处理机制
  4. MongoDB shell 操作
  5. boost::python::enum_相关的测试程序
  6. 【蓝桥杯Java_C组·从零开始卷】第五节(二)、BigDecimal的使用
  7. 高性能网站建设之 MS Sql Server数据库分区
  8. phpcms后台系统怎么去掉html目录_高标准 Vue+Antd 后台系统VueAntdAdmin
  9. SQL Server 当表分区遇上唯一约束(转载)
  10. 使用truffle 创建代币合约 使用ganache部署私有链 以及使用Atom 进行合约代码开发
  11. 修改pip install镜像源
  12. 09月28日 pytorch与resnet(五) 转移学习
  13. HTML5 的输入类型(input type)
  14. 程序员面试华为,面试官出了这样一个面试题,网友:题目太难了
  15. SpringMVC框架中@Controller类的方法的返回值的详细介绍
  16. 实习期将近一月的找工作感想
  17. CSS flex属性深入理解
  18. c语言 的意思啊,c语言中!1是什么意思啊
  19. 玩 High API 系列好文(一):智能客服、钉钉Ding功能、智能云相册、快速实现身份验证
  20. win10/win11 控制面板-网络和 Internet-网络连接“本地连接2“老是自动开启,影响wifi网速

热门文章

  1. 【樽海鞘算法】基于樽海鞘算法求解单目标问题附matlab代码(Salp Swarm Algorithm,SSA)
  2. 定积分的计算(分部积分法)
  3. “2019·中国云计算和物联网大会”来袭,多个亮点
  4. 线性代数让我想想:什么是秩?
  5. hp socket android,HP-Socket精简示例
  6. angular4前后端分离_使用Angular v4的新HTTP客户端
  7. 思科PIX防火墙配置清除
  8. ddt python_python——DDT
  9. 汇编程序:计算分段函数
  10. 模拟产生modbus数据工具