你怎么能在ejb电话上获得呼叫IP地址?

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

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

这篇关于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; } 

你试过:java.rmi.server.RemoteServer.getClientHost()?

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

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

感谢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 "";