过滤器 (Filter)
过滤器是 Java EE 规范中的组件,位于 Servlet 容器中,用于在请求到达 Servlet 之前或响应返回客户端之前进行预处理和后处理。
主要特点:
- 基于函数回调
- 实现
javax.servlet.Filter
接口 - 通过
web.xml
或@WebFilter
注解配置 - 可以修改请求和响应对象
- 不能直接访问 Spring 上下文
实现示例:
@WebFilter("/*")
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 Servlet");
// 继续执行链
chain.doFilter(request, response);
// 后处理
System.out.println("After Servlet");
}
@Override
public void destroy() {
// 清理代码
}
}
拦截器 (Interceptor)
拦截器是 Spring 框架提供的组件,基于 AOP (面向切面编程) 思想实现,主要用于 Spring MVC 应用中。
主要特点:
- 基于 AOP 代理
- 实现
HandlerInterceptor
接口或继承HandlerInterceptorAdapter
- 通过
WebMvcConfigurer
配置 - 可以访问 Spring 上下文
- 更细粒度的控制(可以指定拦截哪些方法)
实现示例:
public class MyInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
// 在控制器方法执行前调用
System.out.println("Pre-handle");
return true; // 返回false则中断请求
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
// 在控制器方法执行后,视图渲染前调用
System.out.println("Post-handle");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler,
Exception ex) throws Exception {
// 在请求完成后调用(视图渲染后)
System.out.println("After completion");
}
}
注册拦截器:
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new MyInterceptor())
.addPathPatterns("/**")
.excludePathPatterns("/login");
}
}
主要区别
特性 | 过滤器 (Filter) | 拦截器 (Interceptor) |
---|---|---|
所属规范 | Java EE | Spring |
依赖 | Servlet 容器 | Spring 容器 |
粒度 | 较粗(URL 级别) | 较细(方法级别) |
AOP 支持 | 不支持 | 支持 |
Spring 上下文访问 | 不能 | 能 |
执行时机 | 在 Servlet 前后 | 在控制器方法前后 |
配置方式 | web.xml 或 @WebFilter | Java 配置或 @Bean |
使用场景
使用过滤器:
- 日志记录
- 编码设置
- 跨域处理 (CORS)
- XSS 防护
- 权限验证(简单场景)
使用拦截器:
- 权限验证(需要访问 Spring 上下文)
- 日志记录(需要记录控制器信息)
- 性能监控
- 业务逻辑处理
在实际开发中,简单的预处理可以使用过滤器,而需要与 Spring 上下文交互或更细粒度控制时,应使用拦截器。