📑 目录
- spring|spring web|拦截器、过滤器、aop
五大核心组件
源码
pom依赖
部分代码
验证结果
spring|spring web|拦截器、过滤器、aop
基于spring-boot 4.0.x
五大核心组件
- ●Filter 过滤器(Servlet层)| 管原始HTTP报文,Spring容器之外
- ●Interceptor 拦截器(SpringMVC层)|管Controller接口请求,做登录/Token拦截
- ●AOP 切面(Bean方法层)|管Java方法执行,做业务增强(日志/事务/耗时)
- ●Request/ResponseBodyAdvice(MVC消息层)| 只修饰、不拦截、不中断请求
- ●ControllerAdvice 全局异常(MVC兜底层) | 只修饰、不拦截、不中断请求
源码
pom依赖
xml
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webmvc</artifactId>
</dependency>
<!-- AOP 切面依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aspectj</artifactId>
</dependency>
</dependencies>
部分代码
java
package com.jysemel.spring.boot.filter;
import jakarta.servlet.*;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import java.io.IOException;
import static org.aspectj.weaver.tools.cache.SimpleCacheFactory.path;
@Slf4j
@Component
public class CustomFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
// 彻底跳过静态图标请求
if(path.contains("favicon.ico")){
// 直接返回,不进入 SpringMVC、拦截器、异常处理
return;
}
log.info("【1-Filter】请求前置拦截");
chain.doFilter(request, response);
log.info("【1-Filter】请求后置收尾");
}
}
java
package com.jysemel.spring.boot.interceptor;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
@Slf4j
public class CustomInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
log.info("【2-Interceptor】preHandle 接口前置校验");
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) {
log.info("【2-Interceptor】postHandle 接口后置处理");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
log.info("【2-Interceptor】afterCompletion 请求最终收尾");
}
}
java
package com.jysemel.spring.boot.aop;
import lombok.extern.slf4j.Slf4j;
import org.springframework.core.MethodParameter;
import org.springframework.http.MediaType;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;
@Slf4j
@RestControllerAdvice
public class CustomResponseAdvice implements ResponseBodyAdvice<Object> {
@Override
public boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType) {
return true;
}
@Override
public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class<? extends HttpMessageConverter<?>> selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) {
log.info("【4-Advice】统一处理接口返回体");
return body;
}
}
验证结果
text
2026-09-16T22:03:25.456+08:00 INFO 47404 --- [nio-8080-exec-3] c.j.spring.boot.filter.CustomFilter : 【1-Filter】请求前置拦截
2026-09-16T22:03:25.456+08:00 INFO 47404 --- [nio-8080-exec-3] c.j.s.b.interceptor.CustomInterceptor : 【2-Interceptor】preHandle 接口前置校验
2026-09-16T22:03:25.457+08:00 INFO 47404 --- [nio-8080-exec-3] com.jysemel.spring.boot.aop.CustomAop : 【3-AOP】Controller方法执行前
【业务代码】Controller业务逻辑执行
2026-09-16T22:03:25.457+08:00 INFO 47404 --- [nio-8080-exec-3] com.jysemel.spring.boot.aop.CustomAop : 【3-AOP】Controller方法执行成功
2026-09-16T22:03:25.458+08:00 INFO 47404 --- [nio-8080-exec-3] c.j.s.boot.aop.CustomResponseAdvice : 【4-Advice】统一处理接口返回体
2026-09-16T22:03:25.460+08:00 INFO 47404 --- [nio-8080-exec-3] c.j.s.b.interceptor.CustomInterceptor : 【2-Interceptor】postHandle 接口后置处理
2026-09-16T22:03:25.460+08:00 INFO 47404 --- [nio-8080-exec-3] c.j.s.b.interceptor.CustomInterceptor : 【2-Interceptor】afterCompletion 请求最终收尾
2026-09-16T22:03:25.460+08:00 INFO 47404 --- [nio-8080-exec-3] c.j.spring.boot.filter.CustomFilter : 【1-Filter】请求后置收尾
2026-09-16T22:03:25.489+08:00 INFO 47404 --- [nio-8080-exec-4] c.j.spring.boot.filter.CustomFilter : 【1-Filter】请求前置拦截
2026-09-16T22:03:25.492+08:00 INFO 47404 --- [nio-8080-exec-4] c.j.s.boot.aop.GlobalExceptionHandler : 【5-全局异常】捕获接口异常:No static resource favicon.ico for request '/favicon.ico'.
2026-09-16T22:03:25.493+08:00 INFO 47404 --- [nio-8080-exec-4] c.j.s.boot.aop.CustomResponseAdvice : 【4-Advice】统一处理接口返回体
2026-09-16T22:03:25.493+08:00 INFO 47404 --- [nio-8080-exec-4] c.j.spring.boot.filter.CustomFilter : 【1-Filter】请求后置收尾