spring|spring web|拦截器、过滤器、aop

📑 目录

  1. 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兜底层) | 只修饰、不拦截、不中断请求

源码

https://gitee.com/jysemel-spring/spring-boot/tree/master/action/action-web-sample/action-web-sample-demo

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】请求后置收尾
相关推荐
mldong8 小时前
一个 App,十三套后端:手机审批端 uni-jeeflow-app 开源了
java·架构
tqs_123459 小时前
MySQL RR隔离级别死锁|Gap间隙锁、临键锁,订单并发范围查询死锁根因方案
java
逆境不可逃9 小时前
Pi Agent 学习笔记:多个工具怎样并行执行
java
weixin_BYSJ198710 小时前
【计算机毕设】基于SpringBoot与Vue的文物保护档案管理系统08621
vue.js·spring boot·spring cloud·微服务·架构·django·课程设计
Flynt10 小时前
Java 27 升级实测:默认值动得比新特性多,有个老参数会让 JVM 直接起不来
java·jvm·后端
Bs_MoneyMagnet10 小时前
基于springboot+vue的个人健康管理系统的设计与实现 源码+文档
java·vue.js·spring boot·后端·vue3·springboot3·计算机毕业设计
星云API技术支持10 小时前
企业微信二次开发:群权限设置、成员管理与群资料维护的接口组合实践
java·前端·企业微信
niucloud-admin11 小时前
JAVA V6 多商户商城 开发文档——job 计划任务开发
java·python·github
海宇AI12 小时前
零信任架构实战:基于海宇柠檬查出险-登记证构建自动化车抵贷核保网关
java·人工智能·架构·自动化