Zc提问: java拦截器过滤器
Ai回答: 在 Java Web 开发中,拦截器(Interceptor) 和 过滤器(Filter) 是两种常见的用于处理请求和响应的机制,它们都可以用来实现如权限验证、日志记录、字符编码处理等功能。虽然它们的功能相似,但在使用场景和实现方式上有一些区别。
一、基本概念
1、Filter(过滤器)
属于 Servlet 规范的一部分,是 Java Web 应用的基础组件。
在 `web.xml` 中配置或通过注解 `@WebFilter` 定义。
可以对所有请求(包括静态资源)进行过滤。
执行时机:在请求进入 Servlet 之前,在响应返回客户端之前。
主要用于:
字符编码设置(如 `setCharacterEncoding(UTF-8)`)
权限校验(但通常不推荐直接在这里做复杂的业务逻辑)
日志记录
压缩响应数据等
2、Interceptor(拦截器)
属于 Spring 框架的一部分,用于在 Spring MVC 中拦截请求。
通过实现 `HandlerInterceptor` 接口或继承 `HandlerInterceptorAdapter` 类来定义。
只能拦截 Spring MVC 处理的请求(即通过 DispatcherServlet 分发的请求),不能拦截静态资源(除非特别配置)。
执行时机:
`preHandle()`:在 Controller 方法执行前调用
`postHandle()`:在 Controller 方法执行后,视图渲染前调用
`afterCompletion()`:在整个请求完成之后调用(无论是否发生异常)
主要用于:
权限控制(如登录检查)
请求日志记录
参数处理
性能监控等
二、对比表格
| 特性 | Filter | Interceptor |
||--|-|
| 所属规范 | Servlet API | Spring Framework |
| 配置方式 | web.xml 或 @WebFilter | springmvc 配置文件或注解 |
| 拦截范围 | 所有请求(包括静态资源) | Spring MVC 处理的请求(默认不包括静态资源) |
| 执行顺序 | 先于 Interceptor 执行 | 在 Filter 之后执行 |
| 使用场景 | 编码、日志、安全等通用功能 | 权限控制、参数处理等与业务相关功能 |
三、使用示例
1、Filter 示例(Java Web)
java
@WebFilter(/*)
public class MyFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
System.out.println(Filter: Before processing);
chain.doFilter(request, response);
System.out.println(Filter: After processing);
}
}
2、Interceptor 示例(Spring MVC)
java
@Component
public class MyInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println(Interceptor: Before controller);
return true; // 返回 true 表示继续处理,false 表示中断
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println(Interceptor: After controller);
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println(Interceptor: After completion);
}
}
然后在 Spring 配置中注册:
java
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Autowired
private MyInterceptor myInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(myInterceptor).addPathPatterns(/);
}
}
四、常见问题
Q1: Filter 和 Interceptor 的执行顺序?
Filter 先执行,然后是 Interceptor。
如果 Filter 中调用了 `chain.doFilter()`,才会继续执行 Interceptor。
Q2: 如何拦截静态资源?
Filter 可以拦截所有资源,包括静态资源。
Interceptor 默认不会拦截静态资源,可以通过配置 `addPathPatterns(/)` 和 `excludePathPatterns(/static/)` 控制。
Q3: 什么情况下用 Filter?什么情况下用 Interceptor?
Filter:适合通用的、与框架无关的操作(如编码、日志、跨域等)。
Interceptor**:适合与 Spring MVC 相关的逻辑(如权限校验、用户信息绑定等)。
五、总结
| 名称 | 适用范围 | 是否依赖框架 | 优先级 | 适用场景 |
|||--|--||
| Filter | 所有请求 | 无 | 高 | 编码、日志、安全等 |
| Interceptor| Spring MVC 请求 | Spring | 低 | 权限控制、参数处理等 |
如果你有具体的使用场景(比如登录验证、日志记录等),我可以帮你写出更具体的代码示例。欢迎继续提问!
商家广告:
🏬产品: 耐高温有隔板高效过滤器 防静电桌
📱咨询:13560190937 李经理
✉️咨询:649099016@qq.com
🔗网址:www.gdznjh.com
🏢公司:广州梓成净化设备制造有限公司
🏭厂址:广州番禺大龙街道长沙路34号北门5栋厂房
0
IP地址: 140.190.22.48
搜索次数: 18
提问时间: 2025-05-11 18:59:55
热门提问:
arkal盘式过滤器
乘客厢空气滤清器是啥
风淋室净化风淋室
高效能风口
风淋房参数
风淋间设备厂家
山东省氢氟酸生产厂家
bka 前置过滤器
风淋室图例
lf4054滤清器
压滤机专业厂家厂家
纯净水过滤器多少钱
广州高效送风口
体外受精超净工作台
高效过滤器检漏公司
玻璃钢石英砂过滤器厂家
山西不锈钢风淋室厂家
雷凌 空调滤清器
净化车间洁净车间
安徽凤凰滤清器
温馨提示:
本站所有问答由Ai自动创作,若有误差请用“联系”里面信息通知我们人工修改或删除。
技术支持:
本站由豌豆Ai提供技术支持,使用的最新版:《豌豆Ai站群搜索引擎系统 V.25.05.20》搭建本站。