كيف يمكنك الحصول على عنوان بروتوكول الإنترنت يدعو على دعوة المنظمة بتبني؟

StackOverflow https://stackoverflow.com/questions/1014358

  •  06-07-2019
  •  | 
  •  

سؤال

إذا يدعو عميل جافا لEJB عن بعد على خادم آخر، كيف يمكنك الحصول على عنوان IP العميل؟ لاحظ أنه من المهم أن تحصل عليه من الخادم، لأن العميل هو المرجح وراء جدار حماية NAT، وفي هذه الحالة نحن بحاجة إلى عنوان IP العام.

ملحوظة: على الرغم من أنه سيكون من الأفضل حل عام، على الأقل كان يمكن استخدام واحد يقوم باسترداد عنوان IP من مكالمة EJB2 على جبوس 4.2.2

هل كانت مفيدة؟

المحلول

هذه المقالة على ويكي مجتمع جبوس يتناول بالضبط مشكلتك. قبل جبوس 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 العميل منذ المواضيع يتم تجميع بدلا من خلق لكل المكالمة. في جبوس 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. في جبوس 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