为啥 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 : null127.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,为啥它受到保护?