你怎么能得到一个EJB调用呼叫的IP地址?(How can you get the calling

2019-06-23 14:36发布

如果Java客户端调用不同服务器上的远程EJB,你怎么能获得客户端的IP地址? 请注意,必须从服务器获取是非常重要的,因为客户端可能是一个NAT防火墙后面,在这种情况下,我们需要的公共IP地址。

注:虽然它会最好是一个通用的解决方案,至少我可以用一个从EJB2调用检索在JBoss 4.2.2的IP地址

Answer 1:

本文 JBoss的社区维基正好解决您的问题。 在此之前的JBoss 5的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;
}


Answer 2:

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

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



Answer 3:

我认为,当前的工作线程的名称中包含的服务器的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);
        }


Answer 4:

由于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 "";


文章来源: How can you get the calling ip address on an ejb call?