java web中可用filter统计接口耗时:在dofilter前后用system.nanotime()计时,通过httpservletresponsewrapper捕获真实状态码,结构化记录uri、耗时、状态码等信息,并合理注册过滤器排除静态资源。

在 Java Web 应用中,使用过滤器(Filter)统计接口响应耗时是一种轻量、统一且不侵入业务代码的方式。核心思路是:在 doFilter 方法的前后分别记录时间戳,相减即得处理耗时,并将结果(如 URL、耗时、状态码等)写入日志或监控系统。
1. 编写耗时统计过滤器
实现 javax.servlet.Filter 接口,在 doFilter 中拦截请求并计算耗时:
- 调用
System.nanoTime()(推荐,纳秒级,高精度且不受系统时间调整影响)或System.currentTimeMillis()(毫秒级,简单够用)获取开始时间 - 执行
chain.doFilter(request, response)放行请求 - 再取一次时间,相减得到耗时(注意单位转换,如纳秒转毫秒需除以 1_000_000)
- 从
HttpServletRequest获取请求路径(request.getRequestURI()),从HttpServletResponse获取状态码(需包装HttpServletResponseWrapper才能捕获)
2. 正确获取响应状态码(关键细节)
原生 HttpServletResponse 的 getStatus() 在过滤器中可能返回默认值(如 200),因为响应尚未提交。必须使用 HttpServletResponseWrapper 包装响应对象,重写 sendError 和 setStatus 方法,记录实际设置的状态码:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 继承
HttpServletResponseWrapper - 添加私有字段
int statusCode = SC_OK - 重写
setStatus(int sc)和sendError(int sc)等方法,更新该字段 - 提供
getRecordedStatus()方法供过滤器读取
3. 记录日志或上报指标
耗时统计后,建议结构化记录,便于排查和监控:
- 基础字段:请求 URI、HTTP 方法、耗时(ms)、状态码、客户端 IP(
request.getRemoteAddr()) - 可选增强:User-Agent、是否登录(从 session 或 token 判断)、异常信息(捕获
Throwable后记录) - 日志级别建议用
INFO或专用日志器(如 SLF4J 的LoggerFactory.getLogger("perf")),避免污染主日志流 - 若接入 Prometheus,可用
Timer(Micrometer)自动上报,无需手动打点
4. 注册过滤器(Spring Boot 示例)
通过 @WebFilter 或配置类注册,确保其生效顺序合理(例如放在权限、日志等过滤器之后):
- 加
@Component+@Order(Ordered.HIGHEST_PRECEDENCE + 10)控制顺序 - 或在配置类中用
@Bean返回FilterRegistrationBean<yourtimingfilter></yourtimingfilter>,显式指定setUrlPatterns和setOrder - 注意排除静态资源(如
/static/**、/actuator/**)避免干扰统计
不复杂但容易忽略的是状态码捕获和过滤器执行顺序。只要包装好响应、精准取时、结构化记录,就能稳定支撑性能分析和慢接口治理。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










