Question

Mon instance Tomcat écoute plusieurs adresses IP, mais je souhaite contrôler l'adresse IP source utilisée lors de l'ouverture d'un URLConnection .

Comment puis-je spécifier ceci?

Était-ce utile?

La solution

Cela devrait faire l'affaire:

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

Et vous avez terminé. N'oubliez pas de gérer les exceptions correctement et modifiez bien sûr les valeurs en fonction de votre scénario.

Ah et j'ai omis les instructions d'importation

Autres conseils

Utilisation du HttpClient commun Apache J'ai également constaté que les éléments suivants fonctionnaient (suppression de try / catch pour plus de clarté):

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

Cependant, je me demande encore ce qui se passerait si la passerelle de l'IP est en panne (192.168.1.11 dans ce cas). La prochaine passerelle sera-t-elle testée ou échouera-t-elle?

La méthode portable évidente serait de définir un proxy dans URL.openConnection. Le proxy peut être en hôte local, vous pouvez alors écrire un proxy très simple qui lie l’adresse locale du socket client.

Si vous ne pouvez pas modifier la source à laquelle l'URL est connectée, vous pouvez remplacer URLStreamHandler lors de l'appel du constructeur de l'URL ou globalement via URL.setURLStreamHandlerFactory. URLStreamHandler peut ensuite déléguer au gestionnaire http / https par défaut, en modifiant l'appel openConnection.

Une méthode plus extrême consisterait à remplacer complètement le gestionnaire (en étendant éventuellement l’implémentation dans votre JRE). Vous pouvez également utiliser d'autres clients http (open source).

Définir manuellement les sockets fonctionne 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;
}    
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top