为啥 HttpServletRequest.getRemoteAddr() 在 Java servlet 中不起作用? [复制]

Posted

技术标签:

【中文标题】为啥 HttpServletRequest.getRemoteAddr() 在 Java servlet 中不起作用? [复制]【英文标题】:Why HttpServletRequest.getRemoteAddr() doesn't work in Java servlet? [duplicate]为什么 HttpServletRequest.getRemoteAddr() 在 Java servlet 中不起作用? [复制] 【发布时间】:2010-09-20 17:52:12 【问题描述】:

我正在使用 java servlet 开发一个 web 应用程序,我希望通过从 processRequest(HttpServletRequest request,HttpServletResponse response) 内部调用 request.getRemoteAddr() 来获取用户 ip 信息。

但它返回一个错误的 IP。由于我对这个领域不是很了解,我不知道它在显示什么,也许是代理,我得到了这个:

远程地址:127.0.0.1 远程主机:127.0.0.1 x-forwarded-for : null

127.0.0.1 不是我的 IP。

但是当我转到:http://www.javascriptkit.com/script/script2/displayip.shtml 时,它会显示正确的,因为我使用的是 servlet,我没有动态生成的 html 页面的 .shtml,我该怎么办?以及为什么那个网站上的脚本可以正确显示,而request.getRemoteAddr()却不能呢?

感谢所有答案,我现在有一个线索,将其部署到服务器后,它可以按预期工作。显示了正确的地址。

但是即使我在本地机器上开发它,如何让它显示绝对IP,就好像它在真实服务器上运行一样?或者可行吗?

【问题讨论】:

当您说wrong ip 时,地址是否在您的域中?错到什么程度?你能告诉我们更多关于调用正在返回什么的信息吗? 【参考方案1】:

它显示的是什么 IP 地址?我的猜测是有一些代理或改变的东西。 (例如,那个脚本页面显示了我的 ADSL 路由器的 IP 地址 - 而不是我 LAN 中的那个 - 原因很明显。)

编辑:现在您已经表明您看到的 IP 地址是 127.0.0.1,答案很清楚 - 您看到的是环回适配器(即同一台机器的快捷方式)大概是因为您是在您正在开发的同一台机器上进行测试。答案完全正确。

在不同的机器上试试,你会得到一个更有用的 IP 地址。

【讨论】:

这也是我的问题。你只是打字更快。 :)【参考方案2】:

通过调用 request.getHeader("X-Forwarded-For") 检查 X-Forwarded-For 标头并查看它返回的 IP。

【讨论】:

我们使用此标头,如果它不可用,请退回 request.getRemoteAddr()【参考方案3】:

您显示的返回 IP 是本地主机 IP。这就提出了一个问题 - 您在哪里进行测试,以及您如何访问 servlet 进行测试?

如果您在本地(开发)机器上运行 servlet,并且还从同一机器上的浏览器调用它,那么这个输出是绝对正确的。

干杯,

-R

【讨论】:

【参考方案4】:

您正在本地计算机上运行您的测试服务器,并在http://localhost/ 上连接到它。由于您是在本地接口上连接,因此连接的来源也是 localhost,即 127.0.0.1。

【讨论】:

【参考方案5】:

如果您使用http://localhost:8080/servlet 调用您的servlet,您通常会得到“localhost”作为远程地址。如果您使用机器的名称,即http://yourmachine/servlet,您通常会得到“正确”的地址。

【讨论】:

以上是关于为啥 HttpServletRequest.getRemoteAddr() 在 Java servlet 中不起作用? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

为啥使用 glTranslatef?为啥不直接更改渲染坐标?

为啥 DataGridView 上的 DoubleBuffered 属性默认为 false,为啥它受到保护?

为啥需要softmax函数?为啥不简单归一化?

为啥 g++ 需要 libstdc++.a?为啥不是默认值?

为啥或为啥不在 C++ 中使用 memset? [关闭]

为啥临时变量需要更改数组元素以及为啥需要在最后取消设置?