0

我需要开发一个 Web 应用程序,它可以通过在服务器端存储一对(源 IP,有效用户名)来识别已知机器和未知机器,之前登录成功。当任何人从未知机器登录时,如何识别。托管 web 应用程序在本地主机中。是否有可能获取客户端 IP。当检索客户端 IP 时,我只得到 127.0.0.1,即 localhost。任何人有任何想法......?

4

2 回答 2

3

简短的回答是您无法始终获得真实的客户端 IP 地址。

如果客户端有自己的 IP 地址并直接连接到服务器,则HttpServletRequest.getRemoteAddr()应该返回它。然而:

  • 如果客户端的请求通过代理或反向代理到达服务器,getRemoteAddr()则将返回第一个上游代理地址。

  • 如果客户端向服务器寻址,localhost则请求将来自本地主机。

  • 如果客户端位于 NAT 网关或 IPv4 <-> IPv6 网桥后面,您可能会看到网关或网桥的 IP 地址。

然后是IP地址可能被欺骗的问题。

简而言之,依赖于知道真实客户端 IP 地址的安全方案通常是有问题的。


如果您的问题是由于反向代理引起的(并且看到 127.0.0.1 会暗示这一点),您可以让反向代理在请求中添加一个请求标头,以说明它看到的远程 IP 地址。然后服务器需要使用该标头而不是getRemoteAddr(). 但是,如果代理没有看到真实的客户端 IP 地址,这将无济于事。

于 2013-01-21T09:03:49.587 回答
0

在 Servlet 中,您可以执行以下操作:

public class GetAddress extends HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
        String ip = request.getRemoteAddr();
        // now you can check if the ip exists and if not store it or do other usefull stuff ...
    }
}
于 2013-01-21T08:42:25.977 回答