كيف يمكنني تحديد العنوان المحلي على java.net.URLConnection؟

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

  •  01-07-2019
  •  | 
  •  

سؤال

يستمع مثيل Tomcat الخاص بي إلى عناوين IP متعددة، ولكنني أريد التحكم في عنوان IP المصدر الذي سيتم استخدامه عند فتح ملف URLConnection.

كيف يمكنني تحديد هذا؟

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

المحلول

هذا ينبغي أن تفعل خدعة:

URL url = new URL(yourUrlHere);
Proxy proxy = new Proxy(Proxy.Type.DIRECT, 
    new InetSocketAddress( 
        InetAddress.getByAddress(
            new byte[]{your, ip, interface, here}), yourTcpPortHere));
URLConnection conn = url.openConnection(proxy);

وقد انتهيت.لا تنس التعامل مع الاستثناءات بشكل جيد وتغيير القيم لتناسب السيناريو الخاص بك.

آه وأنا حذفت بيانات الاستيراد

نصائح أخرى

باستخدام مشتركات Apache HttpClient، وجدت أيضًا ما يلي يعمل (تمت إزالة المحاولة/الالتقاط من أجل الوضوح):

HostConfiguration hostConfiguration = new HostConfiguration();
byte b[] = new byte[4];
b[0] = new Integer(192).byteValue();
b[1] = new Integer(168).byteValue();
b[2] = new Integer(1).byteValue();
b[3] = new Integer(11).byteValue();

hostConfiguration.setLocalAddress(InetAddress.getByAddress(b));

HttpClient client = new HttpClient();
client.setHostConfiguration(hostConfiguration);
GetMethod method = new GetMethod("http://remoteserver/");
method.getParams().setParameter(HttpMethodParams.RETRY_HANDLER,
    new DefaultHttpMethodRetryHandler(3, false));
int statusCode = client.executeMethod(method);

if (statusCode != HttpStatus.SC_OK) {
    System.err.println("Method failed: " + method.getStatusLine());
}

byte[] responseBody = method.getResponseBody();
System.out.println(new String(responseBody));");

ومع ذلك، ما زلت أتساءل ماذا سيحدث إذا كانت بوابة IP معطلة (192.168.1.11 في هذه الحالة).هل ستتم تجربة البوابة التالية أم أنها ستفشل؟

تتمثل الطريقة المحمولة الواضحة في تعيين وكيل في URL.openConnection.يمكن أن يكون الوكيل في مضيف محلي، ويمكنك بعد ذلك كتابة وكيل بسيط للغاية يربط العنوان المحلي لمقبس العميل.

إذا لم تتمكن من تعديل المصدر الذي يتصل به عنوان URL، فيمكنك استبدال URLStreamHandler إما عند استدعاء مُنشئ عنوان URL أو بشكل عام من خلال URL.setURLStreamHandlerFactory.يمكن لـ URLStreamHandler بعد ذلك تفويض معالج http/https الافتراضي، وتعديل استدعاء openConnection.

تتمثل الطريقة الأكثر تطرفًا في استبدال المعالج بالكامل (ربما توسيع نطاق التنفيذ في JRE الخاص بك).وبدلاً من ذلك، يتوفر عملاء http بديلون (مفتوحون المصدر).

إعداد المقبس يدويًا يعمل بشكل جيد ...

private HttpsURLConnection openConnection(URL src, URL dest, SSLContext sslContext)
        throws IOException, ProtocolException {
    HttpsURLConnection connection = (HttpsURLConnection) dest.openConnection();
    HttpsHostNameVerifier httpsHostNameVerifier = new HttpsHostNameVerifier();
    connection.setHostnameVerifier(httpsHostNameVerifier);
    connection.setConnectTimeout(CONNECT_TIMEOUT);
    connection.setReadTimeout(READ_TIMEOUT);
    connection.setRequestMethod(POST_METHOD);
    connection.setRequestProperty(CONTENT_TYPE, SoapConstants.CONTENT_TYPE_HEADER);
    connection.setDoOutput(true);
    connection.setDoInput(true);
    connection.setSSLSocketFactory(sslContext.getSocketFactory());
    if ( src!=null ) {
        InetAddress inetAddress = InetAddress.getByName(src.getHost());
        int destPort = dest.getPort();
        if ( destPort <=0 ) 
            destPort=SERVER_HTTPS_PORT;
        int srcPort = src.getPort();
        if ( srcPort <=0 ) 
            srcPort=CLIENT_HTTPS_PORT;
         connectionSocket = connection.getSSLSocketFactory().createSocket(dest.getHost(), destPort, inetAddress, srcPort);
    }
    connection.connect();
    return connection;
}    
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top