拦截器和过滤器

Posted by Wh0ami-hy on October 19, 2023

1. 过滤器(Filter)

Filter 是在 Servlet 规范中定义的,是 Servlet 容器支持的。

Filter有如下几个用处

主要的用途是设置字符集、控制权限、控制转向、做一些业务逻辑判断等

Filter可以认为是Servlet的一种“加强版”,它主要用于在HttpServletRequest到达Servlet之前,拦截客户的请求,对用户请求进行预处理,也可以对HttpServletResponse进行后处理,是个典型的处理链。使用Filter完整的流程是:Filter对用户请求进行预处理,接着将请求交给Servlet进行处理并生成响应,最后Filter再对服务器响应进行后处理

Filter有如下几个种类

  • 用户授权的Filter:Filter负责检查用户请求,根据请求过滤用户非法请求。
  • 日志Filter:详细记录某些特殊的用户请求。
  • 负责解码的Filter:包括对非标准编码的请求解码。
  • 能改变XML内容的XSLT Filter等。
  • Filter可以负责拦截多个请求或响应;一个请求或响应也可以被多个Filter拦截。

创建一个Filter只需两个步骤

  • 创建Filter处理类(必须实现javax.servlet.Filter接口)
  • web.xml文件中配置Filter

2. 拦截器(Interceptor)

拦截器是在 Spring容器内的,是Spring框架支持的。

用于在某个方法被访问之前,进行拦截,然后在之前或之后加入某些操作。拦截是AOP的一种实现策略。

在Spring构架的程序中,要优先使用拦截器。几乎所有 Filter 能够做的事情, Interceptor 都能够轻松的实现

3. 对比

Filter Interceptor Summary
Filter在只在 Servlet 前后起作用。Filters 通常将 请求和响应(request/response) 当做黑盒子,Filter 通常不考虑servlet 的实现。 拦截器能够深入到方法前后、异常抛出前后等,因此拦截器的使用具有更大的弹性。允许用户介入(hook into)请求的生命周期,在请求过程中获取信息,Interceptor 通常和请求更加耦合。 在Spring构架的程序中,要优先使用拦截器。几乎所有 Filter 能够做的事情, interceptor 都能够轻松的实现
Filter 是 Servlet 规范规定的。 而拦截器既可以用于Web程序,也可以用于Application、Swing程序中。 使用范围不同
Filter 是在 Servlet 规范中定义的,是 Servlet 容器支持的。 而拦截器是在 Spring容器内的,是Spring框架支持的。 规范不同
Filter 不能够使用 Spring 容器资源 拦截器是一个Spring的组件,归Spring管理,配置在Spring文件中,因此能使用Spring里的任何资源、对象,例如 Service对象、数据源、事务管理等,通过IoC注入到拦截器即可 Spring 中使用 interceptor 更容易
Filter 是被 Server(like Tomcat) 调用 Interceptor 是被 Spring 调用 因此 Filter 总是优先于 Interceptor 执行

本站总访问量