如何在Quarkus中仅记录CORS源验证失败的请求信息?
在Quarkus 2.16.10中仅记录CORS验证失败的请求源
针对你的需求,有两种可行方案,无需全局记录所有请求源,仅在CORS验证失败时捕获并记录相关信息:
方案一:自定义Vert.x路由拦截器(编码实现)
Quarkus底层基于Vert.x处理HTTP请求,你可以通过自定义路由拦截器,在CORS过滤器执行后检查验证结果,仅在失败时记录请求源:
- 创建一个
ApplicationScoped的Bean,实现VertxHttpRouterCustomizer接口,插入自定义处理逻辑:
import io.quarkus.vertx.http.runtime.VertxHttpRouterCustomizer; import io.vertx.core.Handler; import io.vertx.ext.web.Router; import io.vertx.ext.web.RoutingContext; import jakarta.enterprise.context.ApplicationScoped; import org.jboss.logging.Logger; @ApplicationScoped public class CorsFailureLogger implements VertxHttpRouterCustomizer { private static final Logger LOG = Logger.getLogger(CorsFailureLogger.class); @Override public void customize(Router router) { // 在CORS过滤器之后注入处理逻辑 router.route().handler(corsFailureHandler()); } private Handler<RoutingContext> corsFailureHandler() { return ctx -> { // 判定是否为CORS验证导致的403错误 boolean isCorsFailure = ctx.response().getStatusCode() == 403 && ctx.request().headers().contains("Origin") // 通过Quarkus CORS过滤器设置的上下文属性进一步确认 && ctx.get("io.quarkus.vertx.http.cors.failure") != null; if (isCorsFailure) { String origin = ctx.request().headers().get("Origin"); LOG.warnf("CORS验证失败 | 请求源: %s | 请求路径: %s | 请求方法: %s", origin, ctx.request().path(), ctx.request().method()); } ctx.next(); }; } }
这个拦截器会在每个请求经过CORS过滤器后执行,仅当检测到CORS导致的403错误时,记录请求源、路径和方法等关键信息。
方案二:通过日志配置实现(无需编码)
Quarkus自带的CORSFilter在DEBUG级别下会输出CORS验证失败的详细日志,包含请求源信息。你可以通过配置日志规则,仅保留失败相关的日志:
- 在
application.properties中开启CORSFilter的DEBUG日志:
quarkus.log.category."io.quarkus.vertx.http.runtime.filters.CORSFilter".level=DEBUG quarkus.log.category."io.quarkus.vertx.http.runtime.filters.CORSFilter".additivity=false
- 配置日志过滤(以Logback为例),创建
src/main/resources/logback.xml,仅记录包含"Invalid CORS request"的日志:
<configuration> <appender name="CORS_FAILURE" class="ch.qos.logback.core.ConsoleAppender"> <filter class="ch.qos.logback.core.filter.EvaluatorFilter"> <evaluator> <expression>message.contains("Invalid CORS request")</expression> </evaluator> <OnMismatch>DENY</OnMismatch> <OnMatch>ACCEPT</OnMatch> </filter> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss} %-5p %c{2} - %m%n</pattern> </encoder> </appender> <logger name="io.quarkus.vertx.http.runtime.filters.CORSFilter" level="DEBUG"> <appender-ref ref="CORS_FAILURE"/> </logger> <root level="INFO"> <appender-ref ref="CONSOLE"/> </root> </configuration>
配置完成后,只有CORS验证失败的请求会被记录,日志内容会包含请求源信息,例如:
2024-05-20 14:30:00 WARN CORSFilter - Invalid CORS request from origin 'https://untrusted-domain.com'
方案对比
- 编码方案:灵活性更高,可自定义记录字段(如请求参数、客户端IP等),适合需要扩展日志信息的场景。
- 日志配置方案:无需编写代码,配置简单,适合快速实现需求的场景。
内容的提问来源于stack exchange,提问作者gian1200
相关产品推荐
相关产品推荐

