Javaクライアントが別のサーバー上のリモートEJBを呼び出す場合、どのようにしてクライアントIPアドレスを取得できますか?クライアントはNATファイアウォールの背後にある可能性が高いため、サーバーから取得することが重要であることに注意してください。この場合、パブリックIPアドレスが必要です。
注:一般的なソリューションであることが望ましいですが、少なくとも、JBoss4.2.2でEJB2呼び出しからIPアドレスを取得するソリューションを使用できます。
Javaクライアントが別のサーバー上のリモートEJBを呼び出す場合、どのようにしてクライアントIPアドレスを取得できますか?クライアントはNATファイアウォールの背後にある可能性が高いため、サーバーから取得することが重要であることに注意してください。この場合、パブリックIPアドレスが必要です。
注:一般的なソリューションであることが望ましいですが、少なくとも、JBoss4.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;
}
現在のワーカースレッドの名前にはサーバーの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);
}
試しましたか:java.rmi.server.RemoteServer.getClientHost()?
http://java.sun.com/j2se/1.5.0/docs/api/java/rmi/server/RemoteServer.html#getClientHost()
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 "";