拦截器和过滤器的区别?使用场景?


拦截器(Interceptor)与过滤器(Filter)的区别及使用场景

1. 核心区别
维度过滤器(Filter)拦截器(Interceptor)
规范/框架Java Servlet 规范(所有 Servlet 容器支持,如 Tomcat、Jetty)。Spring 框架(基于 Spring MVC,属于应用层组件)。
作用范围拦截所有进入容器的请求(包括静态资源,如 HTML、图片)。仅拦截经过 Spring DispatcherServlet 的动态请求(如 Controller 的请求)。
执行层次Servlet 容器层(更底层,独立于 Spring)。Spring MVC 框架层(位于 DispatcherServlet 内部)。
依赖对象操作 ServletRequestServletResponse(无法直接访问 Spring 上下文或处理器对象)。可以访问 Spring 的 Handler(处理器对象)、ModelAndView 等上下文信息。
生命周期随 Servlet 容器启动初始化,全局唯一。由 Spring 容器管理,可通过依赖注入(如 @Autowired)使用 Spring Bean。

2. 功能差异
功能过滤器(Filter)拦截器(Interceptor)
请求/响应内容修改✔️ 可修改请求参数、响应内容(如压缩响应、替换敏感词)。❌ 无法直接修改请求内容,但可操作 ModelAndView
全局性处理(如日志、权限)✔️ 适合处理全局通用逻辑(如设置字符编码、跨域处理)。✔️ 适合处理业务相关逻辑(如用户权限校验、接口耗时统计)。
静态资源处理✔️ 可拦截所有请求(包括静态资源)。❌ 只能拦截动态请求(如 Controller 路径)。

3. 使用场景
过滤器(Filter)的典型场景
  1. 字符编码设置
    统一请求/响应的编码(如 UTF-8)。
    public class EncodingFilter implements Filter {
        public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) {
            req.setCharacterEncoding("UTF-8");
            res.setCharacterEncoding("UTF-8");
            chain.doFilter(req, res);
        }
    }
    
  2. 跨域处理(CORS)
    添加跨域响应头(如 Access-Control-Allow-Origin)。
  3. XSS/SQL 注入防护
    过滤请求参数中的恶意脚本或特殊字符。
  4. 请求日志记录
    记录请求的 URL、IP、耗时等信息。
拦截器(Interceptor)的典型场景
  1. 用户权限校验
    在 Controller 方法执行前验证用户是否登录或具有权限。
    public class AuthInterceptor implements HandlerInterceptor {
        public boolean preHandle(HttpServletRequest req, HttpServletResponse res, Object handler) {
            if (req.getSession().getAttribute("user") == null) {
                res.sendRedirect("/login");
                return false; // 中断请求
            }
            return true;
        }
    }
    
  2. 接口性能监控
    统计接口执行时间。
    public class PerformanceInterceptor implements HandlerInterceptor {
        public boolean preHandle(HttpServletRequest req, HttpServletResponse res, Object handler) {
            req.setAttribute("startTime", System.currentTimeMillis());
            return true;
        }
    
        public void afterCompletion(HttpServletRequest req, HttpServletResponse res, Object handler, Exception ex) {
            long startTime = (Long) req.getAttribute("startTime");
            log.info("Request URL: {} | Time: {}ms", req.getRequestURL(), System.currentTimeMillis() - startTime);
        }
    }
    
  3. 全局参数处理
    在请求处理前向 ModelAndView 中添加公共参数(如当前用户信息)。

4. 执行顺序

在请求处理流程中,过滤器先于拦截器执行

请求 → Filter Chain → DispatcherServlet → Interceptor Chain → Controller

总结

  • 过滤器(Filter)
    适用于与业务无关的底层通用处理(如编码、安全),需操作 ServletRequest/Response
  • 拦截器(Interceptor)
    适用于与业务相关的横切逻辑(如权限、日志),依赖 Spring 上下文和 MVC 组件。

组合使用
在 Spring 应用中,通常同时使用两者:

  • Filter 处理字符编码、跨域、XSS 过滤。
  • Interceptor 处理权限校验、接口监控、参数注入。

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值