在Java Web开发中,过滤器(Filter)和拦截器(Interceptor)都是用于对请求和响应进行预处理和后处理的机制,但它们的实现方式和应用场景有所不同。以下是它们的区别和核心方法:
过滤器(Filter)
定义
过滤器是Servlet规范的一部分,用于在请求到达Servlet之前或响应离开Servlet之后对请求和响应进行过滤和处理。
核心方法
init(FilterConfig filterConfig)
:- 作用:在过滤器实例化后,初始化过滤器。
- 参数:
FilterConfig
对象,包含了过滤器的配置信息。
doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
:- 作用:对请求和响应进行过滤处理。
- 参数:
ServletRequest
:请求对象。ServletResponse
:响应对象。FilterChain
:用于将请求和响应传递给链中的下一个过滤器或目标资源。
- 示例代码:
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
// 前置处理
// 继续传递请求
chain.doFilter(request, response);
// 后置处理
}
destroy()
:- 作用:在过滤器销毁前,执行清理操作。
应用场景
- 记录日志
- 处理编码
- 安全检查
- 压缩响应数据
拦截器(Interceptor)
定义
拦截器是Spring框架的一部分,用于在处理请求的Controller方法前后进行拦截和处理。
核心方法
preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
:- 作用:在请求处理之前进行处理。
- 参数:
HttpServletRequest
:请求对象。HttpServletResponse
:响应对象。Object
:处理器(通常是HandlerMethod)。
- 返回值:
boolean
类型,表示是否继续处理(true
继续,false
中止)。 - 示例代码:
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
// 前置处理
return true; // 继续处理
}
postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)
:- 作用:在请求处理之后但在视图渲染之前进行处理。
- 参数:
HttpServletRequest
:请求对象。HttpServletResponse
:响应对象。Object
:处理器。ModelAndView
:模型和视图对象。
afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
:- 作用:在请求完成后进行处理(包括视图渲染)。
- 参数:
HttpServletRequest
:请求对象。HttpServletResponse
:响应对象。Object
:处理器。Exception
:在请求处理过程中抛出的异常(如果有)。
应用场景
- 验证用户权限
- 记录操作日志
- 修改返回的ModelAndView
总结
- 过滤器(Filter):用于Servlet规范下,在请求和响应进入Servlet前或离开Servlet后进行处理,适用于Web应用的通用处理逻辑。
- 拦截器(Interceptor):用于Spring MVC中,在请求到达Controller方法前后进行处理,适用于与业务逻辑相关的预处理和后处理。