过滤器(Filter)和拦截器(Interceptor)都是用于在请求处理过程中执行额外逻辑的机制,但它们在实现和使用上有一些重要的区别:
过滤器(Filter)
-
定义和用途:
- 过滤器主要用于对请求和响应进行预处理和后处理,可以对进入的请求和返回的响应进行修改或处理。
- 常用于日志记录、认证授权、请求和响应的压缩、字符编码转换等。
-
实现和配置:
- 过滤器是基于Servlet规范的,在Servlet API中定义。
- 需要实现
javax.servlet.Filter
接口,并在web.xml
中配置或使用注解@WebFilter
进行配置。
-
工作流程:
- 过滤器在Servlet容器启动时被加载,并且在每个请求到达Servlet之前和响应返回客户端之前都会被执行。
- 过滤器链是通过
doFilter
方法实现的,过滤器可以选择放行请求或中断请求链。
-
作用范围:
- 过滤器在应用程序的所有请求上下文中起作用,包括静态资源(如HTML、CSS、JS文件)和动态资源(如Servlet)。
拦截器(Interceptor)
-
定义和用途:
- 拦截器是Spring框架中的一个概念,用于在方法调用前后进行处理,主要用于AOP(面向切面编程)相关功能。
- 常用于实现权限验证、日志记录、性能监控、事务管理等。
-
实现和配置:
- 拦截器需要实现
HandlerInterceptor
接口,并在Spring配置文件中进行配置,通常是通过继承WebMvcConfigurerAdapter
类并重写addInterceptors
方法来添加拦截器。 - 在Spring Boot中,可以通过注解
@Configuration
和实现WebMvcConfigurer
接口来配置。
- 拦截器需要实现
-
工作流程:
- 拦截器在Controller方法执行前后以及视图渲染前被调用。
HandlerInterceptor
接口提供了三个方法:preHandle
:在处理请求之前调用。postHandle
:在处理请求之后调用,但在视图渲染之前。afterCompletion
:在整个请求完成之后调用。
-
作用范围:
- 拦截器仅作用于处理动态资源(如Spring MVC的Controller),不会拦截静态资源。
总结
特性 | 过滤器(Filter) | 拦截器(Interceptor) |
---|---|---|
定义和用途 | 基于Servlet规范,用于请求和响应的预处理和后处理 | 基于Spring框架,用于在方法调用前后进行处理 |
实现和配置 | 实现javax.servlet.Filter 接口,配置在web.xml 或注解@WebFilter | 实现HandlerInterceptor 接口,在Spring配置中进行配置 |
工作流程 | 在请求到达Servlet之前和响应返回客户端之前执行 | 在Controller方法执行前后和视图渲染之前执行 |
作用范围 | 作用于所有请求,包括静态和动态资源 | 仅作用于动态资源(如Spring MVC的Controller) |
通过过滤器和拦截器的配合使用,可以对应用程序的请求处理过程进行更加细粒度的控制和管理。
过滤器和拦截器如何拿到请求的参数
过滤器(Filter)
在过滤器中,可以通过HttpServletRequest
对象来获取请求参数。HttpServletRequest
对象提供了一些方法来获取请求参数,例如:
getParameter(String name)
: 获取单个请求参数的值。getParameterValues(String name)
: 获取同名请求参数的所有值,返回一个数组。getParameterMap()
: 获取所有请求参数,返回一个Map<String, String[]>
。
示例代码:
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;public class MyFilter implements Filter {@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {HttpServletRequest httpRequest = (HttpServletRequest) request;String paramValue = httpRequest.getParameter("paramName");// 获取所有参数Map<String, String[]> paramMap = httpRequest.getParameterMap();// 继续处理请求chain.doFilter(request, response);}@Overridepublic void init(FilterConfig filterConfig) throws ServletException {}@Overridepublic void destroy() {}
}
拦截器(Interceptor)
在拦截器中,可以通过HttpServletRequest
对象来获取请求参数。HttpServletRequest
对象可以通过HandlerInterceptor
的preHandle
方法中的HttpServletRequest
参数获取。
示例代码:
import org.springframework.web.servlet.HandlerInterceptor;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Map;public class MyInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {String paramValue = request.getParameter("paramName");// 获取所有参数Map<String, String[]> paramMap = request.getParameterMap();// 继续处理请求return true;}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {// Do something after the handler is executed}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {// Do something after the complete request has finished}
}
总结
- 过滤器:通过
ServletRequest
(通常是HttpServletRequest
)对象获取请求参数。 - 拦截器:通过
HttpServletRequest
对象获取请求参数,通常在preHandle
方法中处理。
两者都可以方便地获取和处理请求参数,但拦截器更多用于Spring框架中的请求处理,而过滤器则是基于Servlet规范的,可以用于更广泛的Java Web应用程序中。