EJB 통화에서 호출 IP 주소를 어떻게 얻을 수 있습니까?
-
06-07-2019 - |
문제
Java 클라이언트가 다른 서버에서 원격 EJB를 호출하는 경우 클라이언트 IP 주소를 어떻게 얻을 수 있습니까? 클라이언트가 NAT 방화벽 뒤에있을 가능성이 높기 때문에 서버에서 가져 오는 것이 중요하며,이 경우 공개 IP 주소가 필요합니다.
참고 : 일반적인 솔루션이지만 최소한 JBOSS 4.2.2의 EJB2 호출에서 IP 주소를 검색하는 솔루션을 사용할 수 있습니다.
해결책
이 기사 Jboss 커뮤니티에서 Wiki는 귀하의 문제를 정확하게 해결합니다. 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);
}
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 "";
제휴하지 않습니다 StackOverflow