Como posso especificar o endereço local em um java.net.URLConnection?
-
01-07-2019 - |
Pergunta
instância Meu Tomcat está ouvindo vários endereços IP, mas eu quero controlar qual o endereço IP de origem é usado ao abrir um URLConnection
.
Como posso especificar essa?
Solução
Isso deve fazer o truque:
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 está feito. Não se esqueça de lidar com exceções bem e fora do curso alterar os valores de acordo com seu cenário.
Ah e eu omitido as instruções de importação
Outras dicas
Usando os commons Apache HttpClient Eu também encontrei o seguinte para o trabalho (tentativa removido / catch para maior clareza):
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));");
No entanto, eu ainda me pergunto o que aconteceria se o gateway do IP é baixo (192.168.1.11, neste caso). Será que o próximo gateway ser julgado ou vai falhar?
A maneira portátil óbvia seria a de definir um proxy no URL.openConnection. O proxy pode estar em host local, você pode então escrever um proxy muito simples que liga o endereço local do soquete do cliente.
Se você não pode modificar a fonte de onde o URL está ligado, você pode substituir o URLStreamHandler quer ao chamar o construtor URL ou globalmente por meio URL.setURLStreamHandlerFactory. O URLStreamHandler pode então delegar o padrão http / https manipulador, modificando a chamada openConnection.
Um método mais extrema seria a de substituir completamente o manipulador (talvez estendendo a implementação em sua JRE). Como alternativa, alternativa (código aberto) http clientes estão disponíveis.
Ajuste fino trabalho tomada manualmente ...
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;
}