在 Java Web 开发中,过滤器(Filter)和拦截器(Interceptor)都用于在请求处理前后做一些通用处理,但它们的位置、作用范围、技术体系和能力有明显区别。
| 对比项 | 过滤器 Filter | 拦截器 Interceptor |
|---|---|---|
| 所属体系 | Servlet 规范 | Spring MVC |
| 作用位置 | 进入 Servlet 之前 / 响应之后 | 进入 Controller 之前 / 之后 |
| 配置方式 | web.xml 或 @WebFilter |
Spring 配置类 |
| 能否获取 Bean | ❌ 不能直接用 Spring Bean | ✅ 可使用 Spring 容器 |
| 是否能中断请求 | ✅ 可以 | ✅ 可以 |
| 作用范围 | 所有请求(包括静态资源) | 仅 Spring MVC 请求 |
| 执行顺序 | 最早 | 在 Filter 之后 |
请求
↓
Filter(过滤器)
↓
DispatcherServlet
↓
Interceptor.preHandle
↓
Controller
↓
Interceptor.postHandle
↓
Interceptor.afterCompletion
↓
Filter(响应)
@WebFilter("/*")
public class EncodingFilter implements Filter {
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain)
throws IOException, ServletException {
req.setCharacterEncoding("UTF-8");
chain.doFilter(req, resp);
}
}
public class LoginInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response,
Object handler) {
// 登录校验
return true;
}
}
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LoginInterceptor())
.addPathPatterns("/**")
.excludePathPatterns("/login");
}
}
✅ 用 Filter 的场景
✅ 用 Interceptor 的场景
Filter 是 Servlet 层的“门卫”,Interceptor 是 Spring MVC 层的“管家”。
如果你愿意,我也可以帮你画一张执行流程图或结合 Spring Boot 举例。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。