【问题标题】:Getting client static IP address获取客户端静态 IP 地址
【发布时间】:2016-01-26 11:59:07
【问题描述】:

我正在 Internet 中部署一个 Web 应用程序,我正在通过检查其客户端 IP 地址(例如 192.168.2.XXX)来检查用户的登录是否有效。实际上,我找到了一个工作代码(如下)。这段代码之前完全可以工作,但一段时间后,它的输出就不再一样了。现在,这段代码只给了我 1 个 IP 地址,它是服务器的 IP 地址。我的代码有什么问题?如何获取客户端的静态 IP 地址而不是服务器的 IP 地址?我也尝试过其他解决方案,例如getRemoteAddr()request.getHeader("PROXY-CLIENT-IP"),但它不起作用。

Java:

String ipAddress = request.getHeader("X-FORWARDED-FOR");
if(ipAddress == null)
    ipAddress = InetAddress.getLocalHost().getHostAddress();

【问题讨论】:

  • 因为第一次,您的请求标头有一个 IP,所以 ipAddress 不为空并且您获得了客户端 IP。第二次,它是空的,它进入if 分支并给你本地主机的(服务器的)IP。
  • 以上链接中的答案均无效
  • @VivekVK 是的,第一行是给我客户端的 IP 地址,但它不是静态的。如何获取客户端以192.168.2.XXX开头的IP地址?

标签: java


【解决方案1】:

您正在混合两个抽象级别,这很少是一件好事。 标头X-FORWARDED_FOR 由负载平衡器或代理插入。如果客户端直接到达服务器,则此标头不存在,您正在执行此代码InetAddress.getLocalHost().getHostAddress();。这正是您所说的:它正在检索运行这段代码的主机的 IP 地址,即 Web 服务器。

参见此处:Getting the client IP address: REMOTE_ADDR, HTTP_X_FORWARDED_FOR, what else could be useful?

【讨论】:

  • 这是否意味着无论不可靠都无法获取客户端的IP地址?
  • 你写道你需要这个来登录。不要将 IP 地址用于身份验证。例如,通过代理伪造 IP 地址并不难。最好让用户明确发送她/他的凭据,即作为 HTTP 消息的一部分。
  • 我实际上也要求提供凭据,但我想限制他们的用户登录,只能在他们各自的计算机(IP 地址)上登录
猜你喜欢
  • 2019-01-14
  • 2013-07-07
  • 2011-05-26
  • 2019-11-13
  • 1970-01-01
  • 2011-01-08
  • 2014-12-29
  • 1970-01-01
  • 2012-03-14
相关资源
最近更新 更多