Spring MVC - 你真的懂 【过滤(Filter)、拦截(Interceptor)和 切片(Aspect)】 ?

本文深入探讨了Spring MVC中的核心概念——过滤器(Filter)、拦截器(Interceptor)和切片(Aspect)。过滤器遵循JEE规范,用于预处理请求和响应,但无法访问Spring上下文。拦截器是Spring提供的,可以获取请求、响应和处理器。而当需要处理处理器上的参数时,就需要使用切面。文中通过创建实例详细解释了每个组件的工作原理和配置过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

截取自:Spring Security OAuth2.0 认证协议【4】

过滤、拦截、切片

非常重要的三个概念,后面用三方类的时候需要有的概念。

在这里插入图片描述

  • 过滤器(Filter)
    JEE的规范,处于最外层,能拿到请求(request)和响应(response),但也只能拿到这两个东西。

    doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)

    由于是JEE规范的东西,因此无法操作spring,即 无法知道请求被哪个controller处理
    但可以通过FilterRegistrationBean把它注册到spring中,被spring管理
    第三方Filter插件的运行原理,下面演示)

  • 拦截器(Interceptor)
    和Filter相反,拦截器是Spring提供的类,天生就能让spring管理(当然,也需要注册),
    相比起 Filter ,Interceptor 除了能拿到 request 和 response,还能拿到 handler (Controller 的处理器)
    postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object handler, ModelAndView modelAndView)

  • 切片(Aspect)
    上面讲了 拦截器(interceptor)可以获得request 、response 和 handler ,但他无法获取 handler 上的参数
    这时候就需要用到 切面(Aspect)了,

下面各自创一个类


# Filter

filter应该都懂,两个重点

  • JEE的规范,处于最外层
  • SpringBoot 环境不能直接创建,需要通过 FilterRegistrationBean

创建 filter 类

package cn.vshop.security.web.filter;

import lombok.extern.slf4j.Slf4j;
import org.springframework.util.StopWatch;

import javax.servlet.*;
import java.io.IOException;

/**
 * @author alan smith
 * @version 1.0
 * @date 2020/3/31 18:00
 */
 // JEE 标准,默认不收spring管理
// 不要直接使用@Component,Spring无法管理,必须借助FilterRegistrationBean创建
//@Component
@Slf4j
public class TimeFilter implements Filter {
   
   

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
   
   
        log.info("time filter init");
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
   
   
        log.info("time filter start");
        StopWatch watch = new StopWatch();
        watch.start("filter");
        filterChain.doFilter(servletRequest, servletResponse);
        watch.stop();
        System.out.println(watch.prettyPrint());
        log.info("time filter finish");
    }

    @Override
    public void destroy() {
   
   
        log.info("time filter destroy");
    }
}

创建 webConfig ,执行web相关注册

package cn.vshop.security.web.config;

import cn.vshop.security.web.filter.TimeFilter;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org