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

Quarkus原生镜像无法正确获取客户端remoteAddress,仅返回服务端IP

解决方案

1. 检查配置前缀是否正确

确保你的application.yaml配置带有quarkus.http前缀,正确配置格式如下:

quarkus:
  http:
    proxy-address-forwarding: true
    allow-forwarded: true

如果仅写proxy-address-forwarding: true这类无前缀的配置,Quarkus会无法识别,导致代理转发逻辑不生效。

2. 确认代理服务器的头信息传递

你的反向代理(如Nginx、Apache)必须正确传递X-Forwarded-For请求头,否则Quarkus无法解析到客户端真实IP。以Nginx为例,需在对应的location块中添加:

proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;

3. 原生镜像构建的扩展依赖检查

确保项目中已添加quarkus-vertx-http扩展(Quarkus 1.x默认可能包含,但需确认),避免原生构建时相关代码被剔除。可以通过以下命令确认扩展存在:

./mvnw quarkus:list-extensions

若缺失,将依赖添加到pom.xml:

<dependency>
    <groupId>io.quarkus</groupId>
    <artifactId>quarkus-vertx-http</artifactId>
</dependency>

4. 替换请求获取方式

在过滤器中,尝试使用CurrentVertxRequest获取请求实例,可能比直接@Context注入更可靠:

import io.quarkus.vertx.http.runtime.CurrentVertxRequest;
import javax.inject.Inject;
import javax.ws.rs.container.ContainerRequestContext;
import javax.ws.rs.container.ContainerRequestFilter;
import javax.ws.rs.ext.Provider;

@Provider
public class ClientIpFilter implements ContainerRequestFilter {

    @Inject
    CurrentVertxRequest currentVertxRequest;

    @Override
    public void filter(ContainerRequestContext requestContext) {
        String clientIp = currentVertxRequest.getCurrent().remoteAddress().toString();
        // 业务逻辑处理
    }
}

5. 升级Quarkus版本

Quarkus 1.13.6.Final存在部分原生镜像与代理转发相关的已知bug,建议升级到该分支的最新稳定版1.13.7.Final,这类问题在后续小版本中已得到修复。

内容的提问来源于stack exchange,提问作者htan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 15:02:10