【问题标题】:How to get client IP address from Apache web server in Struts2/Servlet? [duplicate]如何从 Struts2/Servlet 中的 Apache Web 服务器获取客户端 IP 地址? [复制]
【发布时间】:2014-03-15 09:51:03
【问题描述】:

我正在尝试在 Struts2 中获取客户端 IP 地址。请求通过 Apache Web 服务器路由到 Tomcat 服务器,两台服务器都驻留在同一个物理服务器上。客户端和 Apache 之间的连接是安全的,但 Apache 和 Tomcat 之间的连接不安全。当我尝试获取客户端 IP 地址时,总是得到 127.0.0.1。如何从 Apache Web 服务器获取 Struts2/Servlet 中的客户端 IP 地址?

提前致谢!

【问题讨论】:

  • 我刚刚注意到有关此的通知。 @balusc 这个问题是在 2014 年提出的,您在 2016 年将其标记为重复。认真吗?

标签: java apache tomcat servlets struts2


【解决方案1】:

您可以在 servlet 中获取客户端的 IP 地址 -

HttpServletRequest httpServletRequest = (HttpServletRequest) request;

// Proxy
String userIpAddress = httpServletRequest.getHeader("X-Forwarded-For");

if(userIpAddress == null) {
   userIpAddress = request.getRemoteAddr();
}

【讨论】:

  • 如果userIpAddress不是null,是否也包含代理地址?如果是这样,请帮助我确定在数据库中存储 userIpAddress 值的最大长度。谢谢!
  • 事实上,在看到斯蒂芬的评论后,我有这个疑问——“一个请求可能会经过多个代理”。您的观点有所帮助-“最左边的是原始客户”。顺便说一句,我知道最大客户端 IP 地址。这就是为什么我特别提到userIpAddress(作为代码提到)而不是关于客户端IP。 :)
【解决方案2】:

当我尝试获取客户端 IP 地址时,总是得到 127.0.0.1。

那是因为当您在 Tomcat 的 servlet 中看到它时,请求已被 Apache 前端(反向)代理,并且 Apache Tomcat 流量正在通过环回网络。

解决办法是检查代理添加的headers;例如请参阅@Alexey 的回答。

有几点需要注意:

  • HTTP 规范未指定此行为(代理添加标头)。

  • 不同的代理行为不同;例如他们可能会添加不同的标题。

  • 一个请求可以通过多个代理。

  • 一般来说,不能保证代理人说的是真话,或者它会完全泄露信息。

  • “最终”客户端 IP 地址可能是经过 NAT 处理的地址……这意味着您将难以识别真正的客户端。

【讨论】:

  • 感谢您的积分,投票赞成。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-13
  • 2013-05-26
  • 2013-05-01
相关资源
最近更新 更多