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】请求后置收尾
相关推荐
独泪了无痕6 小时前
Spring Data Redis 快速上手
spring boot·redis·后端
wangchunyu1148 小时前
JAVA CompletableFuture异步编程实战
java·开发语言·python
paopaokaka_luck9 小时前
流浪动物救助与收养系统(DeepSeek AI对话、 ECharts多维分析、救助流程衔接、领养与回访衔接、 捐赠确认与公示、志愿者协作)
java·前端·javascript·人工智能·mysql·echarts·推荐算法
Thomas.Sir9 小时前
第9课:SpringBoot4.x Web开发基础:WebMvc自动配置、静态资源、请求参数接收
java·spring boot
程序 代码狂人9 小时前
切片表与分区表的区别(数据开发面试版)
java·大数据·开发语言·数据仓库·算法
2501_9445215910 小时前
Deepmerge 跨端三方库仓颉适配全流程
java·python·eclipse·github
南归北隐11 小时前
Spring AI Alibaba Graph框架实现MCP数据库查询实战
java·后端·spring ai·mcp·spring ai mcp
古法老登瞎折腾11 小时前
大数据智能运维实战(九):让 AI 查日志——找到异常,也保留上下文
java·大数据·运维·人工智能·spring ai·mcp
ai大模型-探索者11 小时前
Function Call与MCP(区别、联系与实战)
java·服务器·网络
略略略咯咯11 小时前
啊啊啊啊啊
java·服务器·数据库