0

我的任务是确定客户端和 Web 服务器之间是否存在 NAT。我正在使用这个算法:

  1. 用户请求网页
  2. JSP代码运行并获取请求站点的IP
  3. JSP代码获取服务器的内部IP
  4. 我比较了两个 IP,如果它们相同 - 这意味着没有 NAT

我的问题是:如何在 JSP 代码中获取请求站点的 IP 地址? 我尝试使用request.getRequestURL(),但它返回了站点的域名。我也尝试获取请求的标头主机,但它也没有工作。此外,我有没有 DNS 服务的特定服务器,这就是为什么我无法获得 DNS 名称的 IP。

或者任何想法如何确定客户端和服务器之间是否存在 NAT?

4

2 回答 2

2

试试HttpServletRequest.getRemoteAddr()

说明 说:

返回发送请求的客户端或最后一个代理的 Internet 协议 (IP) 地址。对于 HTTP servlet,与 CGI 变量 REMOTE_ADDR 的值相同。

注意:这只会让您(或尝试)获得客户端 IP 地址。不是客户端请求的服务器。

于 2012-06-08T11:34:45.213 回答
0

JSP 代码不能,因为它在服务器上运行。

我假设您实际上是指由 JSP 创建的页面中的 Javascript 代码,但我认为不允许不受信任的 Javascript 找出浏览器的 IP 地址或主机名。

(有一个技巧用于在 javascript 中获取客户端IP 地址,但它涉及向远程服务器发送请求......在您的情况下,远程服务器只能提供 NATed 地址。另一个技巧涉及运行Java 小程序,但我怀疑这也会遇到沙盒限制......除非用户的浏览器信任小程序。)

简而言之,我认为服务器通常不可能找出客户端的 IP 地址是否经过 NAT。


请注意,如果您确实找到了经过 NAT 处理的地址背后的真实 IP 地址,那么它可能对您没有任何用处。IP 地址可能无法路由(因为它在私有范围内和/或在防火墙后面),并且在任何公共 DNS 服务器中都没有名称。

于 2012-06-08T11:35:17.773 回答