如果Java客户端调用不同服务器上的远程EJB,你怎么能获得客户端的IP地址? 请注意,必须从服务器获取是非常重要的,因为客户端可能是一个NAT防火墙后面,在这种情况下,我们需要的公共IP地址。
注:虽然它会最好是一个通用的解决方案,至少我可以用一个从EJB2调用检索在JBoss 4.2.2的IP地址
如果Java客户端调用不同服务器上的远程EJB,你怎么能获得客户端的IP地址? 请注意,必须从服务器获取是非常重要的,因为客户端可能是一个NAT防火墙后面,在这种情况下,我们需要的公共IP地址。
注:虽然它会最好是一个通用的解决方案,至少我可以用一个从EJB2调用检索在JBoss 4.2.2的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 "";