LoggingInterceptor
概述
LoggingInterceptor是tio-boot内置的日志拦截器,之所以提供了这个接口,是为了提高性能. LoggingInterceptor
是一种自定义拦截器,专门用于在控制器方法执行前后记录日志到数据库。它耦合在 ControllerInterceptor
之后执行,可以:
- before 方法中:采集请求信息、目标控制器、方法参数等并写入日志表
- after 方法中:检查返回值是否包含敏感数据,并根据需要追加日志或触发告警
类定义
package com.litongjava.tio.boot.logging;
import java.lang.reflect.Method;
import com.litongjava.tio.http.common.HttpRequest;
public class LoggingInterceptor {
/**
* 在 ControllerInterceptor.before 执行后触发
*
* @param request 当前 HttpRequest 对象
* @param targetController 控制器实例
* @param actionMethod 即将执行的控制器方法
* @param paramValues 方法调用时的参数数组
*/
public void before(HttpRequest request, Object targetController, Method actionMethod, Object[] paramValues) {
// TODO: 从 request、actionMethod、paramValues 中抽取关键信息
// 并写入数据库日志表,如:路径、方法名、参数、入参校验结果等
}
/**
* 在 ControllerInterceptor.after 执行后触发
*
* @param request 当前 HttpRequest 对象
* @param targetController 控制器实例
* @param actionMethod 已执行的控制器方法
* @param paramValues 方法调用时的参数数组
* @param actionReturnValue 方法返回值
* @return 继续向下传递的返回结果,一般不做修改
*/
public Object after(HttpRequest request, Object targetController, Method actionMethod, Object[] paramValues, Object actionReturnValue) {
// TODO: 检查 actionReturnValue 中是否包含敏感信息
// 如发现异常,可追加日志或触发告警
return actionReturnValue;
}
}
配置和执行流程
集成顺序:在主应用中,先注册
ControllerInterceptor
,再在其后调用LoggingInterceptor
。调用时机:
- 框架路由解析并执行
ControllerInterceptor.before
后 - 紧接着调用
LoggingInterceptor.before
记录请求日志 - 业务方法执行并返回后 框架先执行
LoggingInterceptor.after
对返回值进行敏感数据检查 - 然后调用
ControllerInterceptor.after
- 框架路由解析并执行
注册示例:可在
BootConfiguration
中统一组装:public class AppConfig implements BootConfiguration { @Override public void config() { TioBootServer server = TioBootServer.me(); // 主拦截器 server.setControllerInterceptor(new MyControllerInterceptor()); // 后置日志记录 server.addAdditionalInterceptor(new LoggingInterceptor()); } }
注意事项
- 确保
LoggingInterceptor
操作数据库时具备良好性能,避免阻塞主线程 - 针对敏感字段建议使用白名单或黑名单策略,减少误报
- 日志表结构应支持索引查询和分区归档,保证海量日志存储和快速检索
示例场景
- 审计合规:记录用户访问记录,满足审计需求
- 安全监控:检测返回数据中是否泄露隐私字段,如身份证、手机号等
- 性能监控:结合耗时统计,分析慢请求和瓶颈