문제

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 "";
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top