过滤器和拦截器的区别

过滤器和拦截器

Difference:
A Servlet Filter is used in the web layer only, you can’t use it outside of a
web context. Interceptors can be used anywhere. That’s the main difference.

In my opinion one of the biggest difference between Filters and Interceptors is:

Filter works only in J2EE web applications, you can not use outside of the application servers, Interceptors can work in different components and not depends on the web layer, in summary interceptor have a wide field than filters. If you are planning to move some component outside the container, you should consider use interceptors.

Filters work more in the request/response domain, in the other hand interceptor act more in the method execution domain.

If you need to do something that could affect the request or response to your application such as logging, security, audit, or you will affect the data coming on them, your option is filter, don’t forget the plug ability that those provides.

Interceptors are used in conjunction with Java EE managed classes to allow developers to invoke interceptor methods on an associated target class, in conjunction with method invocations or lifecycle events.

  • Filter基于回调函数,我们需要实现的filter接口中doFilter方法就是回调函数,而interceptor则基于java本身的反射机制,这是两者最本质的区别。
  • Filter是依赖于servlet容器的,即只能在servlet容器中执行,很显然没有servlet容器就无法来回调doFilter方法。而interceptor与servlet容器无关。
  • Filter的过滤范围比Interceptor大,Filter除了过滤请求外通过通配符可以保护页面,图片,文件等等,而Interceptor只能过滤请求。
  • Filter的过滤例外一般是在加载的时候在init方法声明,而Interceptor可以通过在xml声明是guest请求还是user请求来辨别是否过滤

####综上所述
一个简单的数据流程,请求过来进入到 Filter pre —>dispatcher—>preHandle–>controller–>postHandle—>afterCompletion—>Filter After

interceptors-or-filters
spring-handlerinterceptor-vs-servlet-filters

<think>好的,用户现在想了解Java Web开发中过滤器(Filter)拦截器(Interceptor)的区别及使用场景。我需要综合之前的回答提供的引用内容来整理出一个清晰的解释。 首先,用户之前的问题是关于ServletSpringMVC的执行流程,所以可能对两者的组件如何协作比较熟悉。现在的问题涉及过滤器拦截器,这两者在处理请求时扮演不同角色,但容易混淆。 根据引用内容,过滤器是Servlet规范的一部分,而拦截器通常是Spring MVC等框架提供的。我需要先明确两者的定义所属规范。例如,引用[2]提到过滤器属于Servlet规范,而拦截器属于框架。这应该是区别的核心点之一。 接下来是应用范围。引用[5]指出过滤器在Web容器级别工作,可以处理所有请求,而拦截器在应用级别,作用于特定的控制器或方法。这部分需要详细说明,可能还要提到配置方式的不同,比如过滤器在web.xml,拦截器在Spring配置中。 然后是执行顺序。根据之前的回答,过滤器的执行在Servlet之前,拦截器在DispatcherServlet之后。这会影响它们在请求处理流程中的位置,需要强调执行顺序的不同。 使用场景方面,引用[4]提到Spring Security使用过滤器,因为不耦合框架,而拦截器适合框架特定的处理。比如权限检查、日志记录,过滤器适合全局处理,拦截器适合更细粒度的控制。 还要注意生命周期,过滤器的生命周期与Servlet容器相关,而拦截器由Spring管理,可能受Spring容器的生命周期影响。这点在引用[3]的代码示例中也有体现,过滤器的initdestroy方法由容器管理。 可能用户还关心如何选择使用哪个,需要结合场景举例,比如跨域处理用过滤器,而参数校验用拦截器。同时要指出拦截器可以访问Spring的上下文,而过滤器不行,这会影响它们的应用范围。 最后,确保回答结构清晰,分点说明区别,再列举使用场景,并给出总结性的建议。需要检查引用标记是否正确,并参考用户提供的引用编号对应到之前的回答内容。</think>### 过滤器(Filter)与拦截器(Interceptor)的区别 #### 1. **规范与依赖** - **过滤器(Filter)** - 属于 **Servlet 规范**(`javax.servlet.Filter`),依赖 Web 容器(如 Tomcat),与框架无关[^2][^3]。 - 可拦截 **所有进入容器的请求**(包括静态资源),无论是否由 Spring MVC 处理[^2][^5]。 - **拦截器(Interceptor)** - 属于 **框架层**(如 Spring MVC 或 Struts),需依赖 Spring 容器[^4][^5]。 - 仅拦截 **通过 DispatcherServlet 的请求**(即 Spring MVC 处理的请求)[^1][^5]。 #### 2. **执行顺序** ```text HTTP请求 → 过滤器(Filter) → Servlet → 拦截器(Interceptor) → Controller方法 ``` - **过滤器**在请求到达 Servlet 之前执行,响应返回客户端之前也可处理[^3]。 - **拦截器**在请求进入 Controller 前后执行(通过 `preHandle`、`postHandle`、`afterCompletion`)[^1][^5]。 #### 3. **功能范围** - **过滤器** - 可修改请求/响应内容(如编码转换、添加请求头)[^3]。 - 示例:日志记录、全局权限校验、XSS 攻击防护。 ```java public class EncodingFilter implements Filter { @Override public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) { req.setCharacterEncoding("UTF-8"); // 修改请求编码 chain.doFilter(req, res); } } ``` - **拦截器** - 仅能读取请求参数,无法直接修改请求内容[^5]。 - 示例:接口耗时统计、Controller 方法级的权限校验。 ```java public class AuthInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest req, HttpServletResponse res, Object handler) { if (req.getSession().getAttribute("user") == null) { res.sendRedirect("/login"); // 未登录跳转 return false; } return true; } } ``` #### 4. **配置方式** - **过滤器**:在 `web.xml` 中配置或通过 `@WebFilter` 注解(Servlet 3.0+)[^3]。 ```xml <filter> <filter-name>LoggingFilter</filter-name> <filter-class>com.example.LoggingFilter</filter-class> </filter> <filter-mapping> <filter-name>LoggingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> ``` - **拦截器**:通过 Spring 配置类注册(实现 `WebMvcConfigurer`)[^1][^5]。 ```java @Configuration public class WebConfig implements WebMvcConfigurer { @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new AuthInterceptor()).addPathPatterns("/api/**"); } } ``` --- ### 使用场景对比 | **场景** | **过滤器(Filter)** | **拦截器(Interceptor)** | |-------------------------|-----------------------------------|------------------------------------| | **全局请求处理** | 日志记录、跨域处理、字符编码统一设置 | Controller 方法调用前后逻辑(如接口耗时统计) | | **安全控制** | XSS 过滤、IP 黑名单拦截 | 基于用户角色的细粒度权限校验(如管理员接口) | | **资源管理** | 静态资源压缩(GZIP) | 动态资源缓存控制 | | **框架耦合性** | 无(适合通用模块,如 Spring Security)[^4] | 需依赖 Spring MVC 等框架 | --- ### 总结 - **优先使用过滤器**:若需处理与业务无关的通用逻辑(如编码、跨域),或需拦截静态资源[^2]。 - **优先使用拦截器**:若需与 Spring 上下文交互(如依赖注入),或控制 Controller 方法级别的逻辑[^4][^5]。 --- ### 相关问题 1. 如何实现过滤器链(Filter Chain)的执行顺序? 2. 拦截器如何获取 Spring 容器中的 Bean? 3. 为什么 Spring Security 选择使用过滤器而非拦截器?[^4]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值