문제

내 Tomcat 인스턴스가 여러 IP 주소를 수신하고 있지만, Tomcat 인스턴스를 열 때 어떤 소스 IP 주소가 사용되는지 제어하고 싶습니다. URLConnection.

이것을 어떻게 지정할 수 있나요?

도움이 되었습니까?

해결책

이렇게 하면 트릭을 수행할 수 있습니다.

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

그리고 당신은 끝났습니다.예외를 훌륭하게 처리하고 시나리오에 맞게 값을 변경하는 것을 잊지 마십시오.

아 그리고 수입명세서는 생략했어요

다른 팁

Apache commons HttpClient를 사용하여 다음이 작동하는 것을 발견했습니다(명확성을 위해 try/catch를 제거했습니다).

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

하지만 IP의 게이트웨이(이 경우 192.168.1.11)가 다운되면 어떻게 되는지 궁금합니다.다음 게이트웨이가 시도될 것인가, 아니면 실패할 것인가?

확실한 이식 가능한 방법은 URL.openConnection에 프록시를 설정하는 것입니다.프록시는 로컬 호스트에 있을 수 있으며 클라이언트 소켓의 로컬 주소를 바인딩하는 매우 간단한 프록시를 작성할 수 있습니다.

URL이 연결된 소스를 수정할 수 없는 경우 URL 생성자를 호출할 때 또는 URL.setURLStreamHandlerFactory를 통해 전역적으로 URLStreamHandler를 바꿀 수 있습니다.그런 다음 URLStreamHandler는 기본 http/https 처리기에 위임하여 openConnection 호출을 수정할 수 있습니다.

더 극단적인 방법은 핸들러를 완전히 바꾸는 것입니다(아마도 JRE에서 구현을 확장하는 것).또는 대체(오픈 소스) http 클라이언트를 사용할 수 있습니다.

수동으로 소켓 설정이 잘 작동합니다 ...

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;
}    
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top