You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Quarkus中仅记录CORS源验证失败的请求信息?

在Quarkus 2.16.10中仅记录CORS验证失败的请求源

针对你的需求,有两种可行方案,无需全局记录所有请求源,仅在CORS验证失败时捕获并记录相关信息:

方案一:自定义Vert.x路由拦截器(编码实现)

Quarkus底层基于Vert.x处理HTTP请求,你可以通过自定义路由拦截器,在CORS过滤器执行后检查验证结果,仅在失败时记录请求源:

  1. 创建一个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验证失败的详细日志,包含请求源信息。你可以通过配置日志规则,仅保留失败相关的日志:

  1. 在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
  1. 配置日志过滤(以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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 01:20:27