过滤器(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应用程序中。