Javaクライアントが別のサーバー上のリモートEJBを呼び出す場合、どのようにクライアントのIPアドレスを取得できますか?クライアントはNATファイアウォールの背後にある可能性が高いので、サーバから取得することが重要です。この場合、パブリックIPアドレスが必要です。ejbコールでどのように呼び出し元のIPアドレスを取得できますか?
注:するjava.rmi.server:それは、好ましくは、最低でも、一般的な解決策になるが、私はあなたがしようとしたことがあり
Javaクライアントが別のサーバー上のリモートEJBを呼び出す場合、どのようにクライアントのIPアドレスを取得できますか?クライアントはNATファイアウォールの背後にある可能性が高いので、サーバから取得することが重要です。この場合、パブリックIPアドレスが必要です。ejbコールでどのように呼び出し元のIPアドレスを取得できますか?
注:するjava.rmi.server:それは、好ましくは、最低でも、一般的な解決策になるが、私はあなたがしようとしたことがあり
This articleのJBossコミュニティのwikiに正確にあなたの問題を解決します。 JBoss 5より前のバージョンでは、明らかにIPアドレスがワーカースレッド名から解析されていなければなりません。そしてそれが以前のバージョンでそれを行う唯一の方法であるように思われます。これは、(上記のリンクからコピーされた)、それをやってコードスニペットです:MicSimへ
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;
}
のJBoss 4.2.2上のEJB2呼び出しからIPアドレスを取得するものを使用することができます。 RemoteServer.getClientHost()?
http://java.sun.com/j2se/1.5.0/docs/api/java/rmi/server/RemoteServer.html#getClientHost()
はい。 JBoss 4.2.2では、RMIメソッドではないという例外をスローします。 JBossは、RMIレスポンスをリッスンする場所とは別のスレッドでEJB実装にメッセージをディスパッチするので、私は想定しています。 – Yishai
おかげで、私は、スレッド名が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 "";
私は、スレッドがむしろプールされているので、現在のワーカースレッドの名前は、サーバーの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);
}
答えをありがとう。ただし、ワーカースレッド名に山括弧はありません。おそらく、これはEJB 3でのみ機能します。私は別の方法でそれを解析する必要がありますが、これは正しい場所に私を得たので、私はこの答えを受け入れています。 – Yishai
うれしい私は助けることができます。 – MicSim
現在のスレッドの名前には、要求ごとに作成されるのではなく、ワーカースレッドがプールされるため、クライアントのIPではなく、サーバーのIPアドレスが含まれます。 – ejboy