当前位置: 首页 > 面试题库 >

在Servlet中获取真实的客户端IP

谷梁智
2023-03-14
问题内容

我遇到一个简单的问题。我将 在HTTPServlet中 获得 真正的客户端IP

从现在开始,我使用:

request.getRemoteAddr()

但是现在它返回一个错误的IP。例如:xxx.xxx.xxx。 50, 但我的IP就像xxx.xxx.xxx。 159
。(在http://whatismyipaddress.com/上检查)。

现在我尝试使用:

request.getHeader("X-Forwarded-For")

它返回NULL。

我还对以下课程进行了探讨:

public class IpUtils {

public static final String _255 = "(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)";
public static final Pattern pattern = Pattern.compile("^(?:" + _255 + "\\.){3}" + _255 + "$");

public static String longToIpV4(long longIp) {
    int octet3 = (int) ((longIp >> 24) % 256);
    int octet2 = (int) ((longIp >> 16) % 256);
    int octet1 = (int) ((longIp >> 8) % 256);
    int octet0 = (int) ((longIp) % 256);

    return octet3 + "." + octet2 + "." + octet1 + "." + octet0;
}

public static long ipV4ToLong(String ip) {
    String[] octets = ip.split("\\.");
    return (Long.parseLong(octets[0]) << 24) + (Integer.parseInt(octets[1]) << 16)
            + (Integer.parseInt(octets[2]) << 8) + Integer.parseInt(octets[3]);
}

public static boolean isIPv4Private(String ip) {
    long longIp = ipV4ToLong(ip);
    return (longIp >= ipV4ToLong("10.0.0.0") && longIp <= ipV4ToLong("10.255.255.255"))
            || (longIp >= ipV4ToLong("172.16.0.0") && longIp <= ipV4ToLong("172.31.255.255"))
            || longIp >= ipV4ToLong("192.168.0.0") && longIp <= ipV4ToLong("192.168.255.255");
}

public static boolean isIPv4Valid(String ip) {
    return pattern.matcher(ip).matches();
}

public static String getIpFromRequest(HttpServletRequest request) {
    String ip;
    boolean found = false;
    if ((ip = request.getHeader("x-forwarded-for")) != null) {
        StringTokenizer tokenizer = new StringTokenizer(ip, ",");
        while (tokenizer.hasMoreTokens()) {
            ip = tokenizer.nextToken().trim();
            if (isIPv4Valid(ip) && !isIPv4Private(ip)) {
                found = true;
                break;
            }
        }
    }

    if (!found) {
        ip = request.getRemoteAddr();
    }

    return ip;
}
}

它还返回了xxx.xxx.xxx.50 IP。:(

现在,我不知道如何获取真实的客户端IP。如果有人知道解决方案,请回答。


问题答案:

我想您的问题是您正在本地网络中某个地方运行服务器,因此您在该网络中获得了IP。但是,当您尝试使用发现您的IP地址的在线服务时,您的IP是服务提供商路由器的IP或类似的名称。使用request.getRemoteAddr()是正确的。这些服务就是这样做的,并且它们没有其他设施。



 类似资料:
  • 本文向大家介绍PHP获取真实客户端的真实IP,包括了PHP获取真实客户端的真实IP的使用技巧和注意事项,需要的朋友参考一下 REMOTE_ADDR 是你的客户端跟你的服务器“握手”时候的IP。如果使用了“匿名代理”,REMOTE_ADDR将显示代理服务器的IP。 HTTP_CLIENT_IP 是代理服务器发送的HTTP头。如果是“超级匿名代理”,则返回none值。同样,REMOTE_ADDR也会被

  • 本文向大家介绍PHP获取用户客户端真实IP的解决方案,包括了PHP获取用户客户端真实IP的解决方案的使用技巧和注意事项,需要的朋友参考一下 获取客户端ip其实不是个简单的活儿,因为存在Ip欺骗,和代理问题,所以获取客户端的IP的真实性会打折扣的,不能百分百准确.但是我们还是尽量找一个比较完善的获取客户端真正ip方法.使用php获取IP的方法能找到很多. 现在需要对这段代码进行解释,这里用到了两个函

  • 透过nginx/apache代理如何获取客户端真实ip ? 使用nginx/apache作为workerman代理,nginx/apache实际上充当了workerman的客户端,所以在workerman上获取的客户端ip为nginx/apache服务器的ip,并非实际的客户端ip。如何获取客户端真实ip可以参考下面的方法。 原理: nginx/apache将客户端真实ip通过http heade

  • 本文向大家介绍Java实现获取客户端真实IP方法小结,包括了Java实现获取客户端真实IP方法小结的使用技巧和注意事项,需要的朋友参考一下 在JSP里,获取客户端的IP地址的方法是:request.getRemoteAddr(),这种方法在大部分情况下都是有效的。但是在通过了Apache,Squid等反向代理软件就不能获取到客户端的真实IP地址了。如果使用了反向代理软件,用request.getR

  • 问题内容: 我在JBOSS中有一个客户端服务器通信方案,并且在浏览器中作为客户端( JAVA PROGRAM )。最初在建立连接时,客户端将其证书发送到服务器。服务器从证书中提取客户端的公钥,因此通信将继续。 现在我的问题是 如何将证书(.cer)从客户端发送到服务器? 如何在服务器中接收证书并提取其公钥? 问题答案: 如何将证书(.cer)从客户端发送到服务器? 客户端证书(.cer,.crt,

  • 本文向大家介绍Java面试之如何获取客户端真实IP,包括了Java面试之如何获取客户端真实IP的使用技巧和注意事项,需要的朋友参考一下 前言 在进行一些小游戏开发时,我们经常比较关注的一个功能便是分享。针对分享,我们希望能根据各个城市或者地区,能有不同的分享文案,辨识地区的功能如果由服务器来完成的话,我们就需要知道客户端的真实IP。今天我们就来看看服务器是如何获取到客户端的真实IP的。 <!--