docker - Spring Boot v1.5.13 Docker:从请求中获取 Docker IP 而不是客户端 IP
问题描述
我有一个在 docker 容器中运行的 spring boot 服务。我正在使用 HttpServletRequest 从传入的客户端请求中获取远程 IP 地址。这在本地按预期工作,但是一旦服务在 Docker 容器中运行,被抓取的 IP 就是 Docker 容器 IP 而不是客户端 IP。有没有办法解决这个问题并获得实际的客户端 IP?非常感激任何的帮助。
以下是更多程序化细节:
@GetMapping("/foo)
public ResponseEntity requestBar(HttpServletRequest request) {
String clientIp = request.getRemoteAddr();
//DO STUFF WITH IP
}
以上是“bar”的示例 GET 请求。使用 HttpServletRequest 您可以获得发出请求的机器的远程地址。在本地运行(在非 dockerized 的本地机器上)上面运行得很好。服务获取客户端IP,我可以验证IP是否正确。在 Docker 中托管相同的服务,调用 getRemoteAddr() 将为容器提供默认网关 IP。我希望这个进一步的解释可以更清楚地说明我想要完成的事情。与往常一样,我们将不胜感激任何和所有帮助。
更新:只需澄清一些花絮,Spring Boot(v1.5.13) 服务在 Docker 主机上运行(Docker 版本 18.06.1-ce,构建 e68fc7a)。我所说的本地运行是指在开发过程中在本地机器上启动服务时。我的所有 Java 开发工作都使用最新版本的 Intellij。可以在我的开发机器上使用 Intellij 启动该服务。
解决方案
推荐阅读
- python - 具有已知对应关系的两个点云的刚性配准
- python - 在 pandas DataFrame 中对月份进行排序
- python - TypeError: 无法根据 interp_func(x, xp, fp, left, right) 的规则“安全”将数组数据从 dtype('O') 转换为 dtype('float64')
- kotlin - Kotlin - 一种将可变列表公开为不可变列表的优雅方式
- swift - 如何快速将导航项按钮连接到视图控制器?
- rust - 为什么 Rust f32 没有给出好的解决方案,而 f64 有?
- c++ - 谷歌测试的“测试框架意外退出错误”
- spring - 具有不同键/值的 Spring Cloud Stream 中的多个输出绑定(AKA 分支)
- c# - 如果在应用程序启动时创建和播种大约 120k 的记录,有什么方法可以加快应用程序的响应时间?
- javascript - 为什么我的 else if 语句在这种情况下不起作用?