区别:
- 拦截器是SpringMVC提供的,过滤器是Servlet提供的。
- 过滤器与servlet是绑定的,仅限于web应用。而拦截器可作用于其他的应用,例如swing应用
- 对所有请求生效(包括静态资源、Servlet、JSP等),可修改请求/响应内容(如编码、敏感词过滤)
- 拦截器仅拦截SpringMVC处理的请求(如Controller方法),无法作用于静态资源或非Spring管理的请
- filter在servlet之前执行doFilter(),在servlet执行之后执行chain.doFilter()
- 拦截器在controller之前执行preHandle(),在controller执行之后执行postHandle();在视图渲染之后afterCompletion()
- 过滤器:主要用于通用预处理(如URL过滤、字符编码设置),无法直接干预业务逻辑;
拦截器:支持更细粒度的业务逻辑(如权限验证、日志记录),且可通过preHandle返回值终止请求
应用场景对比:
| 场景 | 使用 | 示例 |
|---|---|---|
| 全局请求处理(如编码设置) | 过滤器 | 统一设置请求/响应字符集 UTF-8 |
| 静态资源访问控制 | 过滤器 | 限制未授权用户访问图片、CSS等资源 |
| 敏感词过滤 | 过滤器 | 过滤请求参数中的非法内容 |
| 权限验证与登录检查 | 拦截器 | 验证用户Token,拦截未登录请求 |
| 日志记录与性能监控 | 拦截器 | 记录Controller方法执行时间 |
| 业务异常统一处理 | 拦截器 | 捕获Controller异常并返回标准化错误响应 |
拦截器代码示例:
1 |
|
过滤器代码示例:
1 | // 拦截所有请求 |