如何通过CDI配置Quarkus自定义ClientLogger以忽略请求头
如何通过CDI实现Quarkus REST Client Reactive自定义ClientLogger(忽略Bearer请求头)
1. 编写自定义ClientLogger实现类
先实现io.quarkus.rest.client.reactive.ClientLogger接口,用@ApplicationScoped标记让Quarkus能通过CDI扫描到。核心是重写logRequest方法,过滤掉携带Bearer令牌的Authorization请求头,避免敏感信息泄露:
import io.quarkus.rest.client.reactive.ClientLogger; import jakarta.enterprise.context.ApplicationScoped; import org.jboss.resteasy.reactive.client.spi.ClientRequestContext; import io.netty.handler.codec.http.HttpHeaders; @ApplicationScoped public class RedactedAuthClientLogger implements ClientLogger { @Override public void logRequest(ClientRequestContext requestContext) { // 复制原请求头并移除Authorization字段 HttpHeaders sanitizedHeaders = new HttpHeaders(requestContext.headers()); sanitizedHeaders.remove("Authorization"); // 自定义日志格式,也可以参考默认实现的逻辑输出 System.out.printf("[REST Client] 请求:%s %s,头信息:%s%n", requestContext.method(), requestContext.uri(), sanitizedHeaders); } @Override public void logResponse(ClientRequestContext requestContext, int statusCode, HttpHeaders responseHeaders) { // 响应日志可沿用默认逻辑,也可自行定制 System.out.printf("[REST Client] 响应:状态码 %d,头信息:%s%n", statusCode, responseHeaders); } }
2. 绑定自定义Logger到REST Client
有两种绑定方式,按需选择:
- 绑定到单个REST Client接口:在你的REST Client接口上添加
@ClientLogger注解,指定自定义类:
import io.quarkus.rest.client.reactive.ClientLogger; import io.quarkus.rest.client.reactive.RegisterRestClient; import jakarta.ws.rs.GET; @RegisterRestClient(baseUri = "https://your-api-domain.com") @ClientLogger(RedactedAuthClientLogger.class) public interface YourApiClient { @GET String getResource(); }
- 全局生效(所有REST Client共用):只要自定义Logger类是CDI托管的(已加
@ApplicationScoped),Quarkus会自动优先使用它,无需给每个接口加注解,直接替换默认Logger。
几点提醒
- 自定义Logger必须是CDI bean,否则Quarkus无法识别并注入。
- 若想贴合Quarkus默认日志风格,可参考
io.quarkus.rest.client.reactive.DefaultClientLogger的源码调整输出逻辑。 - 确保项目已引入Quarkus REST Client Reactive依赖,否则相关类会报找不到的错误。
内容的提问来源于stack exchange,提问作者leaqui
相关产品推荐
相关产品推荐

