当前位置: 首页 > java >正文

SpringBoot中的拦截器

SpringBoot中的拦截器

Filter

典型场景 全局鉴权/接口耗时统计

@WebFilter("/*") 
public class CostFilter implements Filter {@Overridepublic void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) {long start = System.currentTimeMillis();chain.doFilter(req, res); // 放行江湖令箭System.out.println("接口耗时:"+(System.currentTimeMillis()-start)+"ms");}
}

HandlerInterceptor

典型场景 接口权限验证/请求参数自动装填

public class AuthInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {String token = request.getHeader("X-Token");if(!"vip666".equals(token)){response.setStatus(403);return false; }return true;}
}@Configuration
publicclass WebMvcConfig implements WebMvcConfigurer {@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new AuthInterceptor()).addPathPatterns("/api/**").excludePathPatterns("/api/login");}
}

AOP拦截

典型场景 服务层方法缓存/事务管理

@Aspect
@Component
public class CacheAspect {@Around("@annotation(com.example.anno.Cacheable)")public Object aroundCache(ProceedingJoinPoint jp) {String cacheKey = buildKey(jp);Object cacheVal = redisTemplate.opsForValue().get(cacheKey);if(cacheVal != null) return cacheVal;Object result = jp.proceed();redisTemplate.opsForValue().set(cacheKey, result, 5, TimeUnit.MINUTES);return result;}
}

RestTemplate

典型场景 统一添加请求头/加密请求参数

public class TraceInterceptor implements ClientHttpRequestInterceptor {@Overridepublic ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) {request.getHeaders().add("X-TraceId", UUID.randomUUID().toString());return execution.execute(request, body);}
}// 注册水军
@Bean
public RestTemplate restTemplate() {RestTemplate rt = new RestTemplate();rt.getInterceptors().add(new TraceInterceptor());return rt;
}

Feign拦截器

典型场景 统一签名计算/Header透传

public class FeignAuthInterceptor implements RequestInterceptor {@Overridepublic void apply(RequestTemplate template) {template.header("Authorization", "Bearer " + SecurityContext.getToken());}
}@Configuration
public class FeignConfig {@Beanpublic FeignAuthInterceptor feignAuthInterceptor() {returnnew FeignAuthInterceptor();}
}

WebFilter

典型场景 响应式编程统一编码/跨域处理

@Component
public class CorsWebFilter implements WebFilter {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {ServerHttpResponse response = exchange.getResponse();response.getHeaders().add("Access-Control-Allow-Origin", "*");return chain.filter(exchange);}
}

总结

在这里插入图片描述

顺序

Filter -> Interceptor -> AOP ,越早拦截越省力(但别在Filter里做业务)

性能

用Arthas监控拦截链路耗时

# 查看HandlerInterceptor耗时
trace *.preHandle '#cost>10'# 诊断AOP切面
watch com.example.aop.*Aspect * '{params,returnObj}' -x 3
http://www.xdnf.cn/news/5909.html

相关文章:

  • 精简大语言模型:用于定制语言模型的自适应知识蒸馏
  • RobotxR1:通过闭环强化学习在大语言模型上实现具身机器人智能
  • 【Web应用】Vue 项目前端项目文件夹和文件介绍
  • 17.责任链模式:思考与解读
  • Mysql索引优化
  • State(状态)——对象行为型模式
  • 在scala中sparkSQL读入csv文件
  • 【AI提示词】贝叶斯分析专家
  • C语言编程--二叉树--构建解析树
  • iOS - 如何从appStore获取app版本信息
  • 各类芒果(果实、叶片、产量等)相关数据集
  • Python爬虫实战:研究JavaScript 环境补全逆向解密
  • SQLMesh信号机制详解:如何精准控制模型评估时机
  • CSS可以继承的样式汇总
  • 【言语】刷题3
  • 串口模块详细讲解
  • IO、存储、硬盘、文件系统相关常识
  • 【Bluedroid】蓝牙 HID DEVICE 初始化流程源码解析
  • 十天学会嵌入式技术之51单片机—day-9
  • 【技巧】使用UV创建python项目的开发环境
  • 面试篇:Spring Security
  • C语言—再学习(数据的存储类别)
  • C++ 字符格式化输出
  • python学习笔记七(文件)
  • 分布式链路跟踪
  • lubuntu 系统详解
  • WebpackVite总结篇与进阶
  • Java SpringMVC 和 MyBatis 整合项目的事务管理配置详解
  • DeepSeek 赋能汽车全生态:从产品到服务的智能化跃迁
  • 2025年5月13日第一轮