webdriver_manager原理与企业级实践:解决ChromeDriver版本同步难题
2026/5/22 2:40:51
一步一步讲清楚:
👉接口耗时为什么不能写在 Controller 里?
👉在拦截器里应该怎么“正确、优雅地处理”?
示例代码是这样的:
long start = System.currentTimeMillis(); // 业务逻辑 long cost = System.currentTimeMillis() - start; log.info("接口耗时: {} ms", cost);❌ 问题有 4 个:
大量重复代码
每个接口都要写一遍
业务代码被日志污染
容易漏写 / 写错
无法统一统计所有接口
👉这是典型的横切关注点(Cross-Cutting Concern)
👉 非常适合用:拦截器 / AOP
Spring MVC 中,拦截器(HandlerInterceptor)是最合适的位置。
preHandle → 记录开始时间 controller → 业务逻辑 afterCompletion → 计算耗时 + 打日志@Component public class TimeCostInterceptor implements HandlerInterceptor { private static final Logger log = LoggerFactory.getLogger(TimeCostInterceptor.class); private static final String START_TIME = "startTime"; @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) { request.setAttribute(START_TIME, System.currentTimeMillis()); return true; }@Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) { Long startTime = (Long) request.getAttribute(START_TIME); if (startTime == null) { return; } long cost = System.currentTimeMillis() - startTime; log.info("接口耗时 | {} {} | {} ms", request.getMethod(), request.getRequestURI(), cost); } }@Configuration public class WebConfig implements WebMvcConfigurer { @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new TimeCostInterceptor()) .addPathPatterns("/**") .excludePathPatterns("/static/**"); } }2025-01-01 10:00:01.456 INFO [traceId=9f8a3b7c2d1a4e] 接口耗时 | GET /users/1 | 38 ms✔ 不侵入 Controller
✔ 所有接口自动统计
✔ 日志格式统一
如果你已经使用了MDC + TraceId(前一篇博客内容):
MDC.put("traceId", traceId);那么这里的耗时日志会自动带上 TraceId,无需额外处理。
👉 这就是为什么:
TraceFilter
TimeCostInterceptor
要一起使用
if (cost > 1000) { log.warn("慢接口 | {} {} | {} ms", request.getMethod(), request.getRequestURI(), cost); }if (ex != null) { log.error("接口异常 | {} {} | {} ms", request.getMethod(), request.getRequestURI(), cost, ex); }if (!(handler instanceof HandlerMethod)) { return; }避免静态资源、错误页面干扰统计。
| 场景 | 推荐 |
|---|---|
| 统计接口耗时 | ✅ 拦截器 |
| 记录方法级别日志 | AOP |
| 参数 / 返回值埋点 | AOP |
| 接口级统一日志 | ✅ 拦截器 |
👉HTTP 接口维度 = 拦截器最合适
接口耗时属于横切关注点,
应统一在 Spring MVC 拦截器中处理,
避免侵入 Controller 业务逻辑。