【问题标题】:Get IP address of client in JSP在 JSP 中获取客户端的 IP 地址
【发布时间】:2014-03-19 18:32:45
【问题描述】:

我需要在 JSP 页面中获取客户端的 IP 地址。我尝试了以下方法:

request.getRemoteAddr()
request.getHeader("X_FORWARDED_FOR")
request.getHeader("HTTP_CLIENT_IP")
request.getHeader("WL-Proxy-Client-IP")
request.getHeader("Proxy-Client-IP")
request.getHeader("REMOTE_ADDR")

但是,这些方法都没有返回所需的 IP 地址。 JSP页面中如何获取客户端的IP地址?

【问题讨论】:

  • 如果您使用自定义标题,请始终将它们命名为X-<custom-name>
  • request.getRemoteAddr() 返回什么?
  • 另见this问题。
  • request.getRemoteAddr() 返回 0:0:0:0:0:0:0:1 这不是客户端 IP 的真实值。
  • 尝试request.getRemoteHost()方法,如果客户端不使用该方法返回的客户端的网关ip。否则此方法返回网关的ip。

标签: java jsp ip


【解决方案1】:

为了获取客户端的IP地址,我使用了以下方法

<%   String ip = request.getHeader("X-Forwarded-For");  
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {  
            ip = request.getHeader("Proxy-Client-IP");  
        }  
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {  
            ip = request.getHeader("WL-Proxy-Client-IP");  
        }  
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {  
            ip = request.getHeader("HTTP_CLIENT_IP");  
        }  
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {  
            ip = request.getHeader("HTTP_X_FORWARDED_FOR");  
        }  
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {  
            ip = request.getRemoteAddr();  
        }
        %>

希望这会有所帮助, 请留下反馈。

【讨论】:

    【解决方案2】:
    <%
    out.print( request.getRemoteAddr() );
    out.print( request.getRemoteHost() );
    %>
    

    如果客户端在代理后面,您可能无法获得真实的客户端 IP,您将获得代理的 IP 而不是客户端。但是,代理可能会在特殊的 HTTP 标头中包含请求客户端 IP。

    <%
    out.print( request.getHeader("x-forwarded-for") );
    %>
    

    【讨论】:

    • 但是在客户端和请求的服务器之间没有配置代理时如何获取客户端的IP。
    • link 看到这个帖子。
    • 输出像 0:0:0:0:0:0:0:1 你知道为什么吗??
    【解决方案3】:

    您的应用程序服务器是在负载平衡器、代理还是 Web 服务器后面?只是一个例子; F5 负载均衡器使用“rlnclientipaddr”标头公开客户端 IP 地址:

    request.getHeader("rlnclientipaddr");
    

    【讨论】:

      【解决方案4】:

      您是否使用像 apache 代理这样的反向代理? http://httpd.apache.org/docs/2.2/mod/mod_proxy.html

      在反向代理模式下(例如,使用 ProxyPass 指令),mod_proxy_http 添加多个请求标头,以便将信息传递到源服务器。这些标题是:

      X-Forwarded-For
      The IP address of the client.
      X-Forwarded-Host
      The original host requested by the client in the Host HTTP request header.
      X-Forwarded-Server
      The hostname of the proxy server.
      

      【讨论】:

      • 服务器和客户端之间没有使用代理。使用 X-Forwarded-For 、 X-Forwarded-Host 、 X-Forwarded-Server 的所有值都给出了未使用代理的空原因。
      • 如果您没有使用任何反向代理,只需检查使用 http servlet API - httpServletRequest.getRemoteHost() 和 getRemotePOrt() docs.oracle.com/javaee/6/api/javax/servlet/ServletRequest.html
      • httpServletRequest 中没有任何内容可以为我提供客户端的 IP。我已经检查了整个 API。
      猜你喜欢
      • 2019-01-14
      • 2019-11-13
      • 1970-01-01
      • 2013-07-07
      • 2011-05-26
      • 2010-11-22
      • 2011-09-21
      • 2018-07-27
      • 2015-03-01
      相关资源
      最近更新 更多