Frage

Meine Tomcat-Instanz wird auf mehrere IP-Adressen zu hören, aber ich möchte steuern Adresse, die Quell-IP wird verwendet, wenn eine URLConnection öffnen.

Wie kann ich angeben das?

War es hilfreich?

Lösung

Das sollte es tun:

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);

Und du bist fertig. Vergessen Sie nicht, Ausnahmen gut zu handhaben und natürlich die Werte ändern Ihr Szenario entsprechen.

Ah und ich weggelassen, um die Import-Anweisungen

Andere Tipps

die Apache commons Mit Httpclient Ich habe auch die folgenden arbeiten (entfernt try / catch für Klarheit):

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));");

Allerdings frage ich mich immer noch, was, wenn das Gateway der IP (192.168.1.11 in diesem Fall) ist nach unten passieren würde. Wird die nächste Gateway versucht werden, oder wird es scheitern?

Die offensichtliche tragbare Art und Weise wäre ein Proxy in URL.openConnection einzustellen. Der Proxy in lokaler Host sein kann, können Sie dann eine sehr einfache Proxy schreiben, die die lokale Adresse des Client-Socket bindet.

Wenn Sie die Quelle nicht ändern kann, wo die URL verbunden ist, können Sie die URLStreamHandler entweder ersetzen, wenn der URL-Konstruktor aufrufen oder global durch URL.setURLStreamHandlerFactory. Die URLStreamHandler kann dann auf den Standard delegieren http / https-Handler, der Openconnection-Aufruf zu ändern.

Eine extremere Methode wäre, um vollständig den Handler zu ersetzen (vielleicht die Umsetzung in Ihrem JRE erstreckt). Alternativ sind alternative (Open Source) http-Clients zur Verfügung.

Einstellung manuell Buchse funktionieren ...

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;
}    
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top