在Servlet中获取真实的客户端IP [重复]

2024-04-24

我在一个简单的问题上遇到了一些麻烦。我会得到HTTPServlet 内的真实客户端 IP.

从现在开始我使用:

request.getRemoteAddr()

但现在它返回一个错误的IP。例如:xxx.xxx.xxx。50但我的 IP 类似于 xxx.xxx.xxx。159。 (检查于http://whatismyipaddress.com/ 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 或类似的 IP。使用request.getRemoteAddr()是正确的。这就是此类服务的作用,他们没有其他设施。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在Servlet中获取真实的客户端IP [重复] 的相关文章

  • 如何禁用 Spring 日志记录 DEBUG 消息?

    我正在开发一个简单的桌面应用程序 不是网络应用程序 这是我的log4j properties log4j rootCategory INFO stdout log4j appender stdout org apache log4j Con
  • 无法在 Junit 测试中自动装配 JpaRepository - Spring boot 应用程序

    Hi All 我正在尝试在 Spring boot 应用程序中执行 Junit 测试 Junit 应该测试一些 CRUD 操作 我正在使用 Spring Repositories 特别是 JpaRepository 存储库类 package
  • 翻转旋转和图像

    我正在用 Java 编写一个平台游戏 并且正在手动编码玩家动画 我分别为每个肢体设置动画 改变位置和旋转 当玩家面向右时 这工作得很好 但是当玩家面向左时 我不知道如何处理旋转 以使它们在玩家向左转时看起来相同 每个身体部位的位置都是相对于
  • 在 eclipse indigo 中找不到 Window builder pro

    我读到 Eclipse Indigo 安装了 Window Builder Pro 插件 但我不知道它在哪里 文件 新建 项目没有给我选择 Window Builder Pro 的选项 如何找到它 您需要将此更新站点添加到 Eclipse
  • 有人在实际应用程序中使用短和字节原始类型吗?

    我自 2004 年以来一直使用 Java 进行编程 主要是企业和 Web 应用程序 但我从来没有用过short or byte 而不是只是为了了解这些类型如何工作的玩具程序 即使在一个for loop100次 我们通常会选择int 我不记得
  • java:查找数组中整数的频率

    我需要开发一个java要求用户输入一些内容的程序integers并找出最大和最小的数 以及这些数的平均值 然后 划分数组的集合分成若干子区间用户指定的 然后它生成一个边界点 每个边界点的长度为子区间宽度 问题是我需要创建一个频率 例如 间隔
  • C++ 中的模块路径到 Java JNI 调用

    当我用 C 创建 Java 8 JVM 时 我通常使用类似以下代码的内容来告诉 JVM 类路径 JavaVMOption options new JavaVMOption 1 JVM invocation options options 0
  • Hibernate vs JPA vs JDO - 各自的优缺点? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我熟悉 ORM 这个概念 几年前我什至在 NET 项目中使用过 nHibernate 然而 我还没有跟上 Java 中 ORM 的主题
  • 验证在子类上调用此方法时是否调用了重写的超类方法

    我将用这个例子来展示我的问题 我有一个带有方法的类foo 该类有一个重写此方法的子类 子类的方法调用超类的方法 我可以验证一下吗 我不想测试什么foo在超类中确实如此 我只需要验证它是否被调用 我知道重构可以有所帮助 优先考虑组合而不是继承
  • CreateProcess error=2,系统找不到指定的文件

    我正在用java编写一个程序 它将执行winrar并解压一个jar文件 放在h myjar jar进入文件夹h new 我的java代码是这样的 import java io File import java io IOException
  • 为什么 getSession() 在短时间内间隔的后续请求中不返回相同的会话?

    我正在发送一个 getJSON HTTP GET 请求两次 使用不同的数据 一次又一次 假设我们有 request1 和 request2 我可以在 FF 和 Chrome 的开发者工具中看到我有相同的cookie JSESSIONID F
  • Struts 2 中的 Java 应用程序可以管理多少个会话?

    我正在开发事务管理应用程序 并且正在使用 Struts2 我在内部使用了一个会话来设置和获取值 例如 ActionContext getContext getSession put string string 在应用程序中使用这样的会话是否
  • 来自公共字符串的 Android RSA 加密

    我正在开发一个 Android 应用程序 我希望用户能够使用其他人的公钥加密消息 系统将生成公钥 私钥对 然后可以将消息秘密发送给其他用户 我正在创建一个加密类 它将处理消息的加密 解密 不幸的是我遇到了一些问题 在这种方法中 我想传递用户
  • equals 和 hashcode 的不同字段

    我同意这篇文章的声明在Java中重写equals和hashCode时应该考虑哪些问题 https stackoverflow com questions 27581 overriding equals and hashcode in jav
  • API 与 SonarQube 5.6 和 Java Analyzer 4.0 与 Findbugs 3.3 或 Cobertura 1.6.3 不兼容

    SonarQube 对我的项目的分析失败了5 6 更新后Java插件从版本3 14 to 4 0 在我的 SonarQube 实例中 除了其他插件之外 我目前还有 Findbugs 插件 版本3 3 和 Cobertura 插件 1 6 3
  • Java:删除链表中的所有元素

    Java中如何删除链表中的所有元素without使用已经可用的clear 方法 这项练习的灵感来自于电话采访中收到的一个问题 说我可以用 C 来做这个 void DeleteAllElement ListElement head ListE
  • 过滤(搜索和替换)InputStream 中的字节数组

    我有一个 InputStream 它将 html 文件作为输入参数 我必须从输入流中获取字节 我有一个字符串 XYZ 我想将此字符串转换为字节格式 并检查从 InputStream 获得的字节序列中是否存在与该字符串匹配的字符串 如果有的话
  • 源单元“_BuildScript_”中“语义分析”阶段出现异常

    评估根项目 android 时出现问题 配置项目 app 时出现问题 无法打开构建文件 C Users InFED Laptop Documents GitHub sustain and save android app build gra
  • 如何执行带有参数的命令?

    如何在 Java 中执行带有参数的命令 我试过了 Process p Runtime getRuntime exec new String php var www script php m 2 这是行不通的 String options n
  • RequestDispatcher.forward 到媒体文件?

    我最近有一个需要解决的问题 https stackoverflow com questions 19385223 how to transparently stream a file to the browser并找到了一个解决方案 但如果

随机推荐

  • 在 PHP 中,某些浮点值的总和应为零,但并非如此 [重复]

    这个问题在这里已经有答案了 可能的重复 浮点不准确示例 https stackoverflow com questions 2100490 floating point inaccuracy examples 它将显示 2 30926389
  • Android RecyclerView 与 GridLayoutManager 使项目跨越多行

    I have a collection of photos and I m using a RecyclerView to display them I want to have the first element in my Recycl
  • 简单的程序崩溃

    所以我已经使用 MinGW GCC 版本 4 4 有一段时间了 并决定是时候升级了 我去MinGW网站下载了最新版本的GCC 4 7 0 删除以前的版本并安装最新版本后 即使是最简单的程序也会崩溃 例如 如果我编译这个程序 include
  • 通过日期时间列表根据日期列更新 pandas 数据框列

    老问题 https stackoverflow com q 73168797 15975987 详情请参考上述问题 我需要添加 0 5 个工作日business days第二个列表中不在第一个列表中的每个假期的列 这是一个名为 df 的示例
  • 值的 Ocaml 表示 - 原子

    我查看了一些 OCaml 值的内部表示 空数组的表示是atom 0 即一个块tag 0 and size 0 空浮点数数组由atom 0 too 是否存在由原子表示的任何 OCaml 值tag gt 0 如果不是 OCaml 字节码集包含以
  • AWS Kinesis ShardIteratorType TRIM_HORIZON 的预期行为

    Context 我不一定指的是基于 KCL 的应用程序 只是纯粹的 Kinesis API 调用 是否使用TRIM HORIZON分片迭代器类型立即为您提供流中最早发布的记录 即 Kinesis 内置 24 小时窗口内最早可用的记录 或者只
  • 初始化类和实例化对象之间的区别?

    我尝试通过搜索引擎搜索这个问题 但可以找到一个主题来解释初始化类和实例化对象之间的区别 有人可以解释一下它们有何不同吗 与该主题相关的三个术语是 声明 初始化和实例化 从后到前工作 实例化 这是为对象分配内存的时候 这就是new关键字正在做
  • 在 F# 中的 Choice 之上构建 Either(或 Result)

    我根据 Scott Wlaschin 中的信息构建了一个成功 失败的 monadblog http fsharpforfunandprofit com posts computation expressions wrapper types
  • OpenAI GPT-3 API:如何让模型记住过去的对话?

    有没有办法训练一个大语言模型 法学硕士 存储特定的上下文 例如 我有一个很长的故事 我想提出问题 但我不想把整个故事放在每个提示中 如何才能让LLM 记住这个故事 考虑到 GPT 3 模型没有能够记忆过去对话的参数 看来目前 记忆 过去对话
  • 在 linux shell 中执行程序时得到“dquote>”

    当我在 Linux shell 中执行脚本时 我得到以下输出 dquote gt 这是什么意思 这意味着您执行了一行仅包含一个双引号字符的代码 如下所示 echo Hello shell 正在等待其他报价
  • 将 iPhone/iPad 应用程序合并为一个通用应用程序

    我有两个应用程序 一个用于 iPhone 另一个用于 iPad 我想将它们合并为一个通用应用程序 在我的第一次尝试中 我尝试创建一个新的通用应用程序项目并添加适用于 iPhone 和 iPad 版本的库 iPad 版本编译并运行良好 如预期
  • 如何使用 Cloud Composer 将大数据从 Postgres 导出到 S3?

    我一直在使用 Postgres to S3 运算符将数据从 Postgres 加载到 S3 但最近 我必须导出一个非常大的表 并且我的 Airflow Composer 失败 没有任何日志 这可能是因为我们正在使用 Python 临时文件模
  • 内容脚本仅在重新加载/刷新时加载

    这是我第一次创建 Google Chrome 扩展程序 我无法找到一种方法来可靠地让内容脚本在单击 YouTube 上的建议视频或任何相关视频时运行一次 我尝试将 all frames 设置为 true 但这会多次调用脚本 浏览 YouTu
  • 在并发程序中从 BlockingQueue 获取对象的最佳方法?

    在并发程序中 从 BlockingQueue 中取出对象而不遇到竞争条件的最佳方法是什么 我目前正在执行以下操作 但我不相信这是最好的方法 BlockingQueue
  • 如何在 Python3 中将字符串添加到 tarfile

    我在添加时遇到问题str到 python 中的 tar 存档 在python 2中我使用了这样的方法 fname archive name params src some arbitrarty string to be added to t
  • 如何将参数传递给用 C# 编写的托管代码 dll 的自定义操作?

    我有一个要求 必须将 3 个参数传递给 C 代码 以便在 installshield 中执行托管代码自定义操作 给不了代码啊请有人帮助我 即使是基本的方法 提前致谢 既然您提到了自定义操作 请参阅在程序集自定义操作中指定托管方法的签名 ht
  • Jsf 生命周期 - 验证失败后渲染响应

    我希望 BalusC 或一位 JSF 专家能够帮助我了解 JSF 生命周期的细节 尤其是渲染 我很难理解的是 在渲染响应期间 从模型中获取值并将其显示给用户 现在 如果存在验证错误 则模型不会更新 因此渲染器必须向用户显示组件树中的无效值
  • 在 Magento 中显示产品所属的所有类别

    我正在构思一个新的 Magento 网站 该网站将包含多个类别的产品 我想知道是否可以在产品详细信息页面上显示产品所属的所有类别 我知道有可能得到the类别 但是否可以显示列表all产品属于哪些类别 例如 衬衫可以包含在Shirts类别 以
  • Rails 从一个邮件程序功能发送 2 封不同的电子邮件

    我有必要这样做 因为对我来说这似乎合乎逻辑 def notification vehicle vehicle vehicle mail to gt vehicle owner email address template name gt n
  • 在Servlet中获取真实的客户端IP [重复]

    这个问题在这里已经有答案了 我在一个简单的问题上遇到了一些麻烦 我会得到HTTPServlet 内的真实客户端 IP 从现在开始我使用 request getRemoteAddr 但现在它返回一个错误的IP 例如 xxx xxx xxx 5