竹简文档
切面处理

调试切面

在非调试模式下拦截调试接口的访问,返回未授权错误

DebugAspectHandler

DebugAspectHandler 用于保护调试专用的 Controller 接口。当应用运行在非调试模式时,该切面将拦截对调试接口的访问并抛出 BusinessException,防止调试接口在生产环境中被意外暴露。

MVC vs WebFlux 对比

特性MVC 版本WebFlux 版本
请求对象HttpServletRequestServerWebExchange
权限检查方式仅同步同步 + 响应式
管道集成不适用debugCheckTransformer()

核心方法

checkDebugController

同步方式检查调试接口的访问权限:

DebugAspectHandler.java
@Aspect
@Component
public class DebugAspectHandler {

    // 检查当前是否为调试模式
    public void checkDebugController() {
        if (!isDebugMode()) {
            // 非调试模式下抛出未授权异常
            throw new BusinessException("调试接口不可用", ErrorCode.UNAUTHORIZED);
        }
    }
}

字段

类型

checkDebugControllerReactive(仅 WebFlux)

响应式方式检查调试接口的访问权限:

仅 WebFlux

DebugAspectHandler.java
// 响应式检查调试接口权限
// 接受 ServerWebExchange 参数以获取请求信息
public void checkDebugControllerReactive(ServerWebExchange exchange) {
    // 从 exchange 中获取请求信息进行权限校验
}

debugCheckTransformer(仅 WebFlux)

提供响应式流转换器,用于在 Mono / Flux 管道中插入调试权限检查逻辑:

仅 WebFlux

DebugAspectHandler.java
// 返回响应式转换器,可嵌入 Mono/Flux 管道
public <T> Function<Mono<T>, Mono<T>> debugCheckTransformer() {
    return mono -> mono.transformDeferredContextual((m, ctx) -> {
        // 在响应式管道中执行调试权限检查
        return m;
    });
}

使用示例:

DebugController.java
@RestController
@RequestMapping("/debug")
public class DebugController {

    private final DebugAspectHandler debugAspect;

    @GetMapping("/info")
    public Mono<ResponseEntity<BaseResponse<DebugInfo>>> getDebugInfo() {
        // 在响应式管道中使用 debugCheckTransformer 进行权限检查
        return Mono.just(buildDebugInfo())
                .transform(debugAspect.debugCheckTransformer())
                .flatMap(info -> ResultUtil.success("调试信息", info));
    }
}

使用方式

标记调试接口

在需要保护的调试 Controller 中调用 checkDebugController() 方法:

DebugController.java
@RestController
@RequestMapping("/debug")
@RequiredArgsConstructor
public class DebugController {

    private final DebugAspectHandler debugAspectHandler;

    @GetMapping("/cache/clear")
    public ResponseEntity<BaseResponse<Void>> clearCache() {
        // 非调试模式下将返回 401 Unauthorized
        debugAspectHandler.checkDebugController();

        cacheService.clearAll();
        return ResultUtil.success("缓存已清除");
    }

    @GetMapping("/config/reload")
    public ResponseEntity<BaseResponse<Void>> reloadConfig() {
        debugAspectHandler.checkDebugController();

        configService.reload();
        return ResultUtil.success("配置已重载");
    }
}

非调试模式响应

在生产环境中访问调试接口时,返回如下响应:

response.json
{
  "context": "550e8400-e29b-41d4-a716-446655440000",
  "output": "UNAUTHORIZED",
  "code": 40101,
  "message": null,
  "errorMessage": "调试接口不可用",
  "duration": 1,
  "data": null
}

HTTP 状态码为 401

调试模式配置

调试模式通常通过 Spring Profile 或应用属性控制:

application.yml
# 开发环境
spring:
  profiles:
    active: dev

# 调试模式开关
bamboo:
  debug:
    enabled: true

自动注册

仅 MVC

DebugAspectHandlerBaseSdkAutoConfiguration 自动注册。

仅 WebFlux

DebugAspectHandlerWebFluxSdkAutoConfiguration 自动注册:

WebFluxSdkAutoConfiguration.java
@Bean
public DebugAspectHandler debugAspectHandler() {
    return new DebugAspectHandler();
}

注意事项

  • 调试接口应始终添加 checkDebugController() 保护,避免生产环境暴露
  • 该切面由自动配置注册,开发者无需手动声明 Bean
  • 建议将所有调试接口集中在统一的 URL 前缀下(如 /debug/**),便于管理

下一步

On this page