在 Java Web 开发中,拦截器(Interceptor)和过滤器(Filter)是两种常见的请求处理机制,它们用于对请求和响应进行预处理和后处理
1. 过滤器(Filter)
1.1 作用
Filter 主要用于对 请求(request) 和 响应(response) 进行预处理和后处理,通常用于请求日志记录、编码设置、安全检查等场景
1.2 工作原理
- Filter 作用于 Servlet 之前,对请求进行预处理
- 处理完请求后,Filter 也可以对响应进行后处理
- 通过
FilterChain
将请求传递给下一个 Filter 或 Servlet
1.3 实现步骤
- 实现
javax.servlet.Filter
接口 - 重写
doFilter
方法 - 在
web.xml
中进行配置,或者使用@WebFilter
注解
1.4 示例代码
java
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
@WebFilter("/*") // 作用于所有请求
public class MyFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
System.out.println("Filter: 请求被拦截");
chain.doFilter(request, response); // 继续请求
System.out.println("Filter: 响应被拦截");
}
}
2. 拦截器(Interceptor)
2.1 作用
Interceptor 主要用于 拦截控制器(Controller)的执行 ,在方法执行前后 或视图渲染前执行特定逻辑,如权限控制、日志记录、事务管理等
2.2 工作原理
- Interceptor 依赖 Spring MVC ,拦截的是 Controller 的执行过程
- 可以在**方法调用前(preHandle)、方法调用后(postHandle)、视图渲染后(afterCompletion)**执行逻辑
2.3 实现步骤
- 实现
HandlerInterceptor
接口 - 重写
preHandle
、postHandle
、afterCompletion
方法 - 在 Spring 配置中注册拦截器
2.4 示例代码
java
import org.springframework.web.servlet.HandlerInterceptor;
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 {
System.out.println("Interceptor: 进入 Controller 前");
return true; // 继续执行 Controller 方法
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("Interceptor: 方法执行完毕");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("Interceptor: 视图渲染完成");
}
}
2.5 拦截器的注册
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 InterceptorConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**");
}
}
3. 过滤器与拦截器的对比
比较项 | 过滤器(Filter) | 拦截器(Interceptor) |
---|---|---|
作用范围 | 作用于 所有请求(包括静态资源) | 作用于 Spring MVC 控制器 |
依赖 | Servlet 规范 | Spring MVC |
触发时机 | 在 Servlet 之前 处理请求 | 在 Controller 执行前后 处理请求 |
适用场景 | 编码设置、日志记录、权限控制 | 认证授权、日志、事务处理 |
处理方式 | doFilter 方法 |
preHandle 、postHandle 、afterCompletion |
4. 总结
- Filter 适用于所有请求 ,包括静态资源,可以用于通用的请求预处理和后处理
- Interceptor 仅拦截 Controller 方法 ,适用于控制器层面的拦截,如权限控制、事务管理
- 在 Spring Boot 应用中,一般推荐使用 Interceptor 来拦截业务逻辑,而使用 Filter 处理通用的请求逻辑