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
相关产品推荐
相关产品推荐

