【问题标题】:Get client ip from HttpServer从 HttpServer 获取客户端 ip
【发布时间】:2014-10-06 03:27:11
【问题描述】:

我需要知道客户的 IP 地址,这是我的鳕鱼

    public static void main(String[] args) throws Exception {
    server = HttpServer.create(new InetSocketAddress(8000), 0);
    server.createContext("/", new MyHandler());
    server.setExecutor(null); // creates a default executor
    server.start();
    System.out.println("Client ip is: " + server.getAddress().getAddress());
}

处理程序:

    public static class MyHandler implements HttpHandler {

    @Override
    public void handle(HttpExchange t) throws IOException {

    t.getRemoteAddress().getAddress(); // t is 0:0:0:0:0:0:0:
    }
}

结果: Client ip is: /0:0:0:0:0:0:0:0

为什么我无法获取真实客户的 ip?

【问题讨论】:

  • 5326 将是端口号,而不是 IP 地址。
  • @vandale My 表示除0:0:0:0:0以外的任何其他号码
  • server.getAddress() 如何返回客户地址?这似乎合乎逻辑,这将返回服务器绑定的地址。您应该检查客户端连接时会发生什么...
  • @GPI 那么,我怎样才能获得客户的 ip?
  • 我认为你是在本地运行客户端和服务器,请尝试在单独的计算机上运行客户端

标签: java


【解决方案1】:
InetAddress address = server.getAddress().getAddress();
System.out.println("Client ip is: " +  address.getHostAddress());

上面的这段代码应该给你地址。如果您的 IP 仍然为 0,则可能存在一些权限问题。

【讨论】:

    【解决方案2】:

    通常您可以使用servletRequest.getRemoteAddr() 来获取访问您的网络应用程序的客户端 IP 地址。但是,如果用户在代理服务器后面或通过负载均衡器访问您的 Web 服务器(例如,在云托管中),上述代码 sn -p 将获取代理服务器或负载均衡器服务器的 IP 地址,而不是原来的客户端的 IP 地址。

    因此您应该获取请求的 HTTP 标头“X-Forwarded-For (XFF)”的 IP 地址

     String ipAddress = request.getHeader("X-FORWARDED-FOR");  
       if (ipAddress == null) {  
           ipAddress = request.getRemoteAddr();  
       }
    

    这个sn-p取自here,因为解释是最好的,不需要编辑。 有关更详细的解决方案,您可以参考此 question 的答案。尤其是 user-basZero 的那个。

    【讨论】:

    • 我应该拒绝使用HttpServer 并使用HttpServletRequestHttpServletResponse 对象开始编码吗?
    猜你喜欢
    • 2012-09-02
    • 2011-12-03
    • 2020-12-08
    • 1970-01-01
    • 2021-10-19
    • 2021-06-01
    • 2019-05-08
    • 2016-08-31
    • 1970-01-01
    相关资源
    最近更新 更多