spring--拦截器(Interceptor)&过滤器(Filter)[一]

1. 基本概念

1.1 过滤器(Filter)

  • 来源:Servlet 规范(JavaEE 标准),不是 Spring 特有的。

  • 拦截范围:可以拦截所有请求(包括静态资源:CSS、JS、图片等)。

  • 执行位置:在 DispatcherServlet 之前执行。

  • 作用:对请求和响应做统一处理。

常见内置过滤器:CharacterEncodingFilterHiddenHttpMethodFilter


1.2 拦截器(Interceptor)

  • 来源:Spring MVC 提供的功能。

  • 拦截范围:只拦截由 DispatcherServlet 分发的请求(即 Controller 层,静态资源不会被拦截)。

  • 执行位置:在 Controller 方法前后执行,并可在视图渲染前后做处理。

  • 作用:业务相关的拦截和逻辑增强。

常见应用:权限校验、日志记录、上下文填充。


2. 执行流程对比

📌 请求生命周期:

浏览器请求 → Tomcat(Servlet容器) 
   → Filter(过滤器) 
      → DispatcherServlet 
         → Interceptor(拦截器) 
            → Controller(业务逻辑) 
         ← Interceptor(返回) 
      ← DispatcherServlet 
   ← Filter 
← 响应返回浏览器

🔑 区别:

  • Filter 更靠前,更底层,管“全局系统”

  • Interceptor 更靠近业务,管“Controller逻辑”


3. 核心区别

对比项过滤器 Filter拦截器 Interceptor
来源Java Servlet 规范Spring MVC 框架
执行时机DispatcherServlet 之前DispatcherServlet 之后,Controller 执行前后
拦截对象所有请求(含静态资源)仅 Controller 请求
粒度粗,偏系统级细,偏业务逻辑
配置方式@WebFilterFilterRegistrationBean实现 HandlerInterceptor 并注册到 WebMvcConfigurer
适用场景编码、跨域、XSS 过滤登录校验、日志、权限控制

4. 使用场景

4.1 过滤器常见场景

  1. 统一编码处理(防止中文乱码)

  2. 跨域处理 CORS(处理 OPTIONS 请求等)

  3. XSS 攻击过滤

  4. SQL 注入拦截

  5. 静态资源访问控制


4.2 拦截器常见场景

  1. 登录校验(如检查 Session 或 Token)

  2. 接口权限控制

  3. 接口调用日志、耗时统计

  4. 请求参数预处理(填充用户上下文到 ThreadLocal)

  5. 国际化处理


5. 代码示例

5.1 Filter 示例(编码过滤器)

import jakarta.servlet.*;
import jakarta.servlet.annotation.WebFilter;
import java.io.IOException;

@WebFilter(urlPatterns = "/*") // 拦截所有请求
public class EncodingFilter implements Filter {
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        request.setCharacterEncoding("UTF-8");
        response.setCharacterEncoding("UTF-8");
        System.out.println("Filter:统一编码处理");
        chain.doFilter(request, response); // 放行
    }
}

5.2 Interceptor 示例(登录拦截器)

import org.springframework.web.servlet.HandlerInterceptor;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

public class LoginInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        Object user = request.getSession().getAttribute("user");
        if (user == null) {
            response.sendRedirect("/login");
            return false; // 拦截
        }
        System.out.println("Interceptor:用户已登录");
        return true; // 放行
    }
}

注册拦截器:

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 {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new LoginInterceptor())
                .addPathPatterns("/**") // 拦截所有请求
                .excludePathPatterns("/login", "/css/**", "/js/**"); // 排除
    }
}

6. 总结口诀

  • Filter 管系统:跨域、编码、安全防护。

  • Interceptor 管业务:登录校验、权限、日志统计。

📌 执行顺序:
Filter → DispatcherServlet → Interceptor → Controller → Interceptor → DispatcherServlet → Filter

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值