Pregunta

Mi instancia de Tomcat es escuchar a varias direcciones IP, pero quiero controlar que la dirección IP de origen se utiliza cuando la apertura de un URLConnection.

¿Cómo puedo especificar esto?

¿Fue útil?

Solución

Esto debe hacer el truco:

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

Y listo.No te olvides de controlar las excepciones bien y apagado de cambiar los valores para adaptarse a su situación.

Ah y he omitido las declaraciones de importación

Otros consejos

Usando el Apache commons HttpClient también he encontrado el siguiente trabajo (eliminado try/catch para mayor claridad):

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

Sin embargo, todavía me pregunto qué pasaría si la puerta de enlace la IP es abajo (192.168.1.11 en este caso).Va a la siguiente puerta de enlace de ser juzgados o no?

La obvia portátil sería configurar un Proxy en la URL.openConnection.El proxy puede ser en el host local, a continuación, puede escribir una muy simple proxy que se une a la dirección local del socket de cliente.

Si usted no puede modificar la fuente en la que la URL está conectado, usted puede reemplazar la URLStreamHandler ya sea cuando se llama al constructor de URL o globalmente a través de la URL.setURLStreamHandlerFactory.El URLStreamHandler continuación, puede delegar en el defecto de http/https controlador, la modificación de la openConnection llamada.

Una forma más extrema método sería para reemplazar completamente el controlador (tal vez la ampliación de la aplicación en su JRE).Como alternativa, la alternativa (open source) http de los clientes están disponibles.

Ajuste manualmente el zócalo de funcionar bien ...

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;
}    
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top