拦截器(Interceptor)与过滤器(Filter)的区别及使用方法(Java)
主要区别
| 特性 | 过滤器(Filter) | 拦截器(Interceptor) |
|---|---|---|
| 作用范围 | Servlet规范的一部分,任何Java Web应用可用 | 通常是框架提供(如Spring MVC) |
| 实现原理 | 基于函数回调 | 基于Java反射和动态代理 |
| 依赖 | 依赖Servlet容器(Tomcat等) | 依赖框架(如Spring) |
| 执行时机 | 在Servlet之前和之后执行 | 在Controller方法前后执行 |
| 获取上下文信息 | 只能获取Servlet API的请求/响应对象 | 可以获取Spring上下文和Controller信息 |
| 异常处理 | 不能处理Controller抛出的异常 | 可以处理Controller抛出的异常 |
过滤器(Filter)使用方法
1. 实现Filter接口
java
import javax.servlet.*;
import java.io.IOException;
public class MyFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// 初始化代码
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
// 前置处理
System.out.println("Before filter processing");
// 执行后续过滤器或Servlet
chain.doFilter(request, response);
// 后置处理
System.out.println("After filter processing");
}
@Override
public void destroy() {
// 销毁代码
}
}2. 配置过滤器(web.xml或注解)
XML配置方式(web.xml):
xml
<filter>
<filter-name>myFilter</filter-name>
<filter-class>com.example.MyFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>myFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>注解方式(Java EE 6+):
java
@WebFilter(urlPatterns = "/*")
public class MyFilter implements Filter {
// ...
}拦截器(Interceptor)使用方法(以Spring为例)
1. 实现HandlerInterceptor接口
java
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class MyInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
// Controller方法执行前调用
System.out.println("Pre-handle interceptor");
return true; // 返回true继续执行,false中断请求
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
// Controller方法执行后,视图渲染前调用
System.out.println("Post-handle interceptor");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
// 整个请求完成后调用
System.out.println("After completion interceptor");
}
}2. 注册拦截器(Spring配置)
java
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new MyInterceptor())
.addPathPatterns("/**") // 拦截所有路径
.excludePathPatterns("/login"); // 排除登录路径
}
}使用场景建议
使用过滤器(Filter)的场景:
- 请求和响应的内容修改(如编码设置)
- 跨域处理
- 静态资源处理
- 通用日志记录
- 权限验证(简单场景)
使用拦截器(Interceptor)的场景:
- 需要访问Spring上下文或Controller信息
- 需要处理Controller抛出的异常
- 需要细粒度的权限控制
- 需要记录Controller方法的执行时间
- 需要修改ModelAndView对象
执行顺序
在Spring应用中,完整的请求处理流程通常为:
- Filter.doFilter() 前置处理
- Interceptor.preHandle()
- Controller方法执行
- Interceptor.postHandle()
- 视图渲染
- Interceptor.afterCompletion()
- Filter.doFilter() 后置处理