在Spring框架中,过滤器和拦截器都用于在请求处理前后执行特定操作,但它们的作用范围和实现方式有所不同。
1. 过滤器(Filter)
过滤器是Servlet规范的一部分,主要用于在请求到达Servlet之前或响应发送给客户端之前进行预处理或后处理。过滤器可以操作请求和响应的内容、头信息等。
特点:
-
作用范围:过滤器作用于Servlet容器级别,适用于所有进入容器的请求。
-
实现方式:通过实现
javax.servlet.Filter
接口,在web.xml中进行配置或者使用@WebFilter
注解进行声明。 -
执行顺序:过滤器的执行顺序由
web.xml
中的配置顺序决定,或通过@Order
注解指定。
示例:
java">import javax.servlet.*;
import java.io.IOException;@WebFilter(urlPatterns = "/*")
public class MyFilter implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {System.out.println("过滤器初始化");}@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {System.out.println("过滤器开始处理请求");chain.doFilter(request, response); // 放行System.out.println("过滤器开始处理响应");}@Overridepublic void destroy() {System.out.println("过滤器销毁");}
}
2. 拦截器(Interceptor)
拦截器是Spring MVC框架的一部分,主要用于在控制器方法执行前后或视图渲染前后进行拦截处理。拦截器通常用于处理与业务逻辑相关的操作。
特点:
-
作用范围:拦截器作用于Spring MVC的DispatcherServlet级别,适用于Spring MVC处理的请求。
-
实现方式:通过实现
HandlerInterceptor
接口或继承HandlerInterceptorAdapter
类。 -
执行顺序:拦截器的执行顺序由Spring配置决定,可以通过
Order
注解或配置顺序指定。
示例:
java">import org.springframework.web.servlet.HandlerInterceptor;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;public class MyInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println("拦截器处理请求");// 假设这里进行权限验证return true; // 放行}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {System.out.println("拦截器处理请求后数据");}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {System.out.println("拦截器处理响应后");}
}
在Spring配置中注册拦截器:
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 WebConfig implements WebMvcConfigurer {@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new CustomInterceptor()).addPathPatterns("/**");}
}
区别总结:
-
作用范围:
-
过滤器作用于Servlet容器级别,适用于所有请求。
-
拦截器作用于Spring MVC级别,仅适用于Spring MVC处理的请求。
-
-
实现方式:
-
过滤器通过实现
javax.servlet.Filter
接口。 -
拦截器通过实现
HandlerInterceptor
接口或继承HandlerInterceptorAdapter
类。
-
-
执行时机:
-
过滤器在请求进入Servlet之前和响应发送给客户端之前执行。
-
拦截器在控制器方法执行前后和视图渲染前后执行。
-
-
配置方式:
-
过滤器通常在
web.xml
中配置。 -
拦截器通常在Spring配置类中通过
InterceptorRegistry
注册。
-
适用场景:
-
过滤器:适用于需要对所有请求进行统一处理的场景,如字符编码设置、请求日志记录、权限验证等。
-
拦截器:适用于需要对Spring MVC处理的请求进行特定业务逻辑处理的场景,如用户认证、日志记录、性能监控等。
通过合理使用过滤器和拦截器,可以在不同层次上实现对请求和响应的处理,提升应用的灵活性和可维护性。