Domanda

La mia istanza di Tomcat è in ascolto a più indirizzi IP, ma voglio controllare che l'indirizzo IP di origine è utilizzato quando l'apertura di un URLConnection.

Come posso specificare questo?

È stato utile?

Soluzione

Questo dovrebbe fare il trucco:

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

E si è fatto.Non dimenticate di gestire le eccezioni bene e ovviamente modificare i valori per soddisfare il vostro scenario.

Ah e ho omesso le istruzioni di importazione

Altri suggerimenti

Usare Apache commons HttpClient ho anche trovato le seguenti per il lavoro (rimosso il blocco try/catch per chiarezza):

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

Tuttavia, mi chiedo ancora che cosa accadrebbe se il gateway l'IP è giù (192.168.1.11 in questo caso).Sarà il prossimo gateway essere provato o fallire?

Ovvio portatili modo sarebbe quello di impostare un Proxy in URL.openConnection.La delega può essere in host locale, è quindi possibile scrivere un semplice proxy che lega l'indirizzo locale del client socket.

Se non è possibile modificare il sorgente in cui l'URL è collegato, è possibile sostituire il URLStreamHandler sia quando si chiama l'URL o il costruttore mondiale tramite URL.setURLStreamHandlerFactory.Il URLStreamHandler può quindi delegare al default http/https gestore, la modifica openConnection chiamata.

Più estremo metodo potrebbe essere quello di sostituire completamente il gestore (magari estendendo l'implementazione JRE).In alternativa, alternativa (open source) http clienti sono disponibili.

Manualmente l'impostazione della presa di lavorare bene ...

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;
}    
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top