1. 过滤器
过滤器(Filter)是 Java Web 应用中用于在请求到达 Servlet 之前和响应离开 Servlet 之后执行某些任务的组件。过滤器可以修改请求和响应,常用于实现日志记录、安全控制、字符编码转换等功能。
例如,实现一个简单的日志记录过滤器:
@WebFilter("/myPath/*")
public class LogFilter implements Filter {public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)throws IOException, ServletException {System.out.println("Request received at " + new Date());// 继续请求的处理chain.doFilter(request, response);System.out.println("Response sent at " + new Date());}// 其他必要的方法,如 init 和 destroy
}
在这个例子中,过滤器会在处理请求之前和之后打印时间日志。所有通过 URL 模式 /myPath/*
访问的请求都会触发这个过滤器。
2. 拦截器
拦截器(Interceptor)是 Spring 框架中用于在处理 HTTP 请求的过程中,在特定的切入点提供额外处理逻辑的组件。拦截器通常用于实现跨切面关注点(如日志、权限验证、事务管理)。
例如,实现一个简单的日志记录拦截器:
public class LogInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {System.out.println("Before handling the request");return true; // 继续流程}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) {System.out.println("After handling the request");}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {System.out.println("After completing the request and response");}
}
在 Spring 配置中注册拦截器:
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new LogInterceptor());}
}
这个拦截器会在请求被处理之前、之后以及完成后打印日志。通过这种方式,拦截器能够为请求处理流程提供额外的逻辑。
3. 过滤器和拦截器的区别
过滤器(Filter)和拦截器(Interceptor)都是用于处理 HTTP 请求的组件,但它们在功能和使用上有些区别:
-
执行层级:
- 过滤器是基于 Servlet 的,作用于请求进入 Servlet 前和响应离开 Servlet 后。
- 拦截器是 Spring 的一部分,仅作用于 DispatcherServlet 和 Controller 之间。
-
功能范围:
- 过滤器主要用于处理请求和响应的通用任务,如日志记录、安全检查、请求响应的修改等。
- 拦截器更侧重于业务逻辑的处理,如性能监控、事务管理、权限检查等。
-
配置和使用:
- 过滤器的配置通常在 web.xml 中或通过注解完成。
- 拦截器是通过实现 Spring 的
HandlerInterceptor
接口或通过继承HandlerInterceptorAdapter
类,并在 Spring 配置文件中定义。
-
控制粒度:
- 过滤器对所有请求都起作用,它们在 Servlet 容器级别处理请求。
- 拦截器可以更精细地控制处理哪些请求,可以指定应用于特定的 URL 模式或 Controller。
总的来说,过滤器和拦截器虽然功能有重叠,但过滤器更接近于底层的请求处理,而拦截器则更集成于 Spring 应用程序的上下文中,提供了更高级的功能和控制。