代码之家  ›  专栏  ›  技术社区  ›  Yishai

如何在ejb调用中获取调用ip地址?

  •  2
  • Yishai  · 技术社区  · 17 年前

    如果java客户机在不同的服务器上调用远程EJB,您如何获得客户机IP地址?请注意,从服务器获取它很重要,因为客户端可能位于NAT防火墙后面,在这种情况下,我们需要公共IP地址。

    注意:尽管它最好是一个通用解决方案,但至少我可以使用一个从JBoss4.2.2上的EJB2调用检索IP地址的解决方案

    4 回复  |  直到 17 年前
        1
  •  3
  •   MicSim    17 年前

    This article 在JBoss社区上,wiki正好解决了您的问题。在JBoss5之前,显然必须从工作线程名称解析IP地址。这似乎是在早期版本中实现这一点的唯一方法。这是执行此操作的代码段(从上面的链接复制):

    private String getCurrentClientIpAddress() {
        String currentThreadName = Thread.currentThread().getName();
        System.out.println("Threadname: "+currentThreadName);
        int begin = currentThreadName.indexOf('[') +1;
        int end = currentThreadName.indexOf(']')-1;
        String remoteClient = currentThreadName.substring(begin, end);
        return remoteClient;
    }
    
        2
  •  1
  •   Ryan Fernandes    17 年前

    您是否尝试过:java.rmi.server.RemoteServer.getClientHost()?

    http://java.sun.com/j2se/1.5.0/docs/api/java/rmi/server/RemoteServer.html#getClientHost()

        3
  •  1
  •   ejboy    13 年前

    我认为当前工作线程的名称包含服务器的IP地址,但不包含客户端的IP地址,因为线程是池化的,而不是为每个调用创建的。在JBoss 4中,可以使用以下解决方法来获取客户端的IP地址:

            try {
                //Reflection is used to avoid compile-time dependency on JBoss internal libraries
                Class clazz = Class.forName("org.jboss.web.tomcat.security.HttpServletRequestPolicyContextHandler");
                Field requestContextField = clazz.getDeclaredField("requestContext");
                requestContextField.setAccessible(true);
                ThreadLocal ctx = (ThreadLocal) requestContextField.get(null);
                ServletRequest req = ((ServletRequest) ctx.get());
                return req==null?null:req.getRemoteAddr();
            } catch (Exception e) {
                LOG.log(Level.WARNING, "Failed to determine client IP address",e);
            }
    
        4
  •  0
  •   Yishai    17 年前

    多亏了MicSim,我才知道线程名存储了IP地址。在JBoss 4.2.2中,EJB2项的线程名称如下所示:

    http-127.0.0.1-8080-2

    (我假设http是可选的,具体取决于实际使用的协议)。

    然后可以使用正则表达式对此进行解析,如下所示:

        Pattern pattern = Pattern.compile("\\b(?:\\d{1,3}\\.){3}\\d{1,3}\\b");
        Matcher matcher = pattern.matcher(Thread.currentThread().getName());
        if (matcher.find()) {
            return matcher.group();
        }
        return "";
    
    推荐文章