【问题标题】:Get IP address of client machine in Spring MVC在 Spring MVC 中获取客户端机器的 IP 地址
【发布时间】:2017-10-15 04:43:51
【问题描述】:

我有一个java spring MVC Web 应用程序,我正在尝试获取正在访问该应用程序的客户端计算机的 IP 地址。我尝试了下面显示的代码,

InetAddress addr = InetAddress.getLocalHost();
String ipAddr = addr.getHostAddress();

但这会返回本地主机的 IP 地址。 我还尝试了一些其他在网上找到的建议,如下所示:

String remoteAddr = "";
if (request != null) {
  remoteAddr = request.getHeader("X-FORWARDED-FOR");
  if (remoteAddr == null || "".equals(remoteAddr)) {
      remoteAddr = request.getRemoteAddr();
  }
}

这也没有给出正确的 IP 地址。我还尝试了以下方法,但对我没有任何帮助: https://www.mkyong.com/java/how-to-get-client-ip-address-in-java/

what is the right way to get request's ip

没有给我正确的 IP 地址。有什么解决方案可以让我尝试获取正在访问我的应用程序的机器的正确 IP 地址。

【问题讨论】:

  • 哪里错了?我的意思是你得到什么IP?请注意,如果客户端位于 NAT 防火墙后面,则无法获取客户端 IP 地址,只能获取防火墙地址。
  • 你不能可靠地做到这一点。如果客户端在进行 NAT 的路由器后面——就像大多数人在访问互联网时一样——你将获得的最好的就是路由器的 IP。当您的服务在代理和/或负载均衡器后面运行时,如果所有这些组件都正确设置并转发 X-FORWARDED-FOR 标头,您将只能获得客户端 IP。例如,在 Kubernetes 1.4 上运行的 Google-Container-Engine 中,根本没有机会获取客户端的 IP,因为 kubernetes 没有传递它。所以你可以尝试,但没有可靠的方法。
  • @Andreas ,我正在尝试从 IP 111.92.68.2 访问应用程序。但是使用上述代码打印的 IP 不是正确的 192.168.0.1 或 127.0.0.1
  • getLocalHost() 返回服务器环回地址(127.0.0.1),所以肯定不是这样。其他代码应该已经打印了客户端 IP,但是像 192.168.0.1 这样的内部 IP 地址意味着您的服务器可能位于不转发该信息的 HTTP 代理或负载平衡器后面。但是,它可能只是使用不同的名称,所以尝试转储(打印/记录)所有 HTTP 标头并查看。

标签: java spring-mvc servlets httprequest


【解决方案1】:

你必须从请求的来源读取请求,试试这个

public void readIp(HttpServletRequest request,HttpServletResponse response){
    String ip = request.getRemoteAddr();
    System.out.println("ip: "+ip);
}

【讨论】:

  • 你看问题中的代码了吗? getRemoteAddr() 在内部 if 语句中被调用,并且 OP 说 “这也没有给出正确的 IP 地址”
  • @Andreas 你知道他从哪里向他的应用程序发出请求吗,他告诉他正在获取本地机器的 ip 地址,那么在这种情况下他可能是从 loacl 机器发出请求吗?他将获得本地机器的IP地址。你也读过这段代码 InetAddress addr = InetAddress.getLocalHost();字符串 ipAddr = addr.getHostAddress();他只是创建 InetAddress 的对象,而不是读取请求,在这种情况下他也会得到 localhost ip 地址
  • OP 在使用getLocalHost() 时获取本地主机IP,但问题的后半部分 是使用getRemoteAddr()。请阅读完整的问题,并注意remoteAddr = request.getRemoteAddr();
  • 你能问 OP 从哪里向他提出申请吗????因为代码是正确的,所以无论如何它都会起作用
  • @Satish Kumar,我正在尝试从 IP 111.92.68.2 访问应用程序。但是使用上述代码打印的 IP 不是正确的 192.168.0.1 或 127.0.0.1
猜你喜欢
  • 2011-07-22
  • 2015-10-18
  • 1970-01-01
  • 1970-01-01
  • 2019-01-14
  • 1970-01-01
  • 2011-02-04
  • 2019-11-13
相关资源
最近更新 更多