Skip to content

LoggingInterceptor ​

概述 ​

LoggingInterceptor是tio-boot内置的日志拦截器,之所以提供了这个接口,是为了提高性能. LoggingInterceptor 是一种自定义拦截器,专门用于在控制器方法执行前后记录日志到数据库。它耦合在 ControllerInterceptor 之后执行,可以:

  • before 方法中:采集请求信息、目标控制器、方法参数等并写入日志表
  • after 方法中:检查返回值是否包含敏感数据,并根据需要追加日志或触发告警

类定义 ​

java
package nexus.io.tio.boot.logging;

import java.lang.reflect.Method;
import nexus.io.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;
    }
}

配置和执行流程 ​

  1. 集成顺序:在主应用中,先注册 ControllerInterceptor,再在其后调用 LoggingInterceptor。

  2. 调用时机:

    • 框架路由解析并执行 ControllerInterceptor.before 后
    • 紧接着调用 LoggingInterceptor.before 记录请求日志
    • 业务方法执行并返回后 框架先执行 LoggingInterceptor.after 对返回值进行敏感数据检查
    • 然后调用 ControllerInterceptor.after
  3. 注册示例:可在 BootConfiguration 中统一组装:

    java
    public class AppConfig implements BootConfiguration {
        @Override
        public void config() {
            TioBootServer server = TioBootServer.me();
            // 主拦截器
            server.setControllerInterceptor(new MyControllerInterceptor());
            // 后置日志记录
            server.addAdditionalInterceptor(new LoggingInterceptor());
        }
    }

注意事项 ​

  • 确保 LoggingInterceptor 操作数据库时具备良好性能,避免阻塞主线程
  • 针对敏感字段建议使用白名单或黑名单策略,减少误报
  • 日志表结构应支持索引查询和分区归档,保证海量日志存储和快速检索

示例场景 ​

  • 审计合规:记录用户访问记录,满足审计需求
  • 安全监控:检测返回数据中是否泄露隐私字段,如身份证、手机号等
  • 性能监控:结合耗时统计,分析慢请求和瓶颈

MIT Licensed