Domanda

Ho bisogno di impostare l'autenticazione per procura contro un proxy SOCKS. Ho scoperto questo post dando istruzioni che appaiono a lavorare con i proxy HTTP comune.

        httpclient.getHostConfiguration().setProxy("proxyserver.example.com", 8080);

        HttpState state = new HttpState();
        state.setProxyCredentials(new AuthScope("proxyserver.example.com", 8080), 
           new UsernamePasswordCredentials("username", "password"));
        httpclient.setState(state);

Vorrei che il lavoro con SOCKS deleghe così o devo fare qualcosa di diverso?

È stato utile?

Soluzione

Il Caratteristiche pagina di Apache HTTPClient dice:

  

connessioni trasparenti attraverso proxy SOCKS (versione 4 e 5) con supporto nativo presa Java.

Con "trasparente", credo che significa che funziona senza la necessità di fare nulla di speciale. Hai un proxy SOCKS disponibile da qualche parte? Non puoi solo provare a vedere se funziona?

Altri suggerimenti

configurazione proxy

Java supporta Calze tramite le preferenze:

  • socksProxyHost per il nome host del server proxy SOCKS
  • socksProxyPort per il numero di porta, il valore di default essendo 1080

per es.

java -DsocksProxyHost=socks.mydomain.com

( modifica ) Per il vostro esempio, se il proxy SOCKS è stato configurato nel modo descritto in precedenza:

httpclient.getHostConfiguration().setProxy("proxyserver.example.com", 8080);
Credentials cred = new UsernamePasswordCredentials("username","password");
httpclient.getState().setProxyCredentials(AuthScope.ANY, cred); 

È inoltre possibile utilizzare questa variante (senza httpclient):

SocketAddress addr = new
InetSocketAddress("webcache.mydomain.com", 8080);
Proxy proxy = new Proxy(Proxy.Type.SOCKS, addr); // Type.HTTP for HTTP

Quindi, completando l'esempio precedente, possiamo ora aggiungere:

URL url = new URL("http://java.sun.com/");
URConnection conn = url.openConnection(proxy);

HTH

SOCKS non è supportato da HttpClient 3 in modo nativo. Si può provare il supporto SOCKS in JDK come suggerito da altri. L'effetto collaterale è che tutta la vostra JVM passerà attraverso lo stesso proxy SOCKS.

Java 5 supporta nome utente / password di autenticazione in SOCKS (tipo 2). Tutto quello che dovete fare è configurare l'autenticatore come questo,

Authenticator.setDefault(new Authenticator() {
    protected PasswordAuthentication getPasswordAuthentication() {
        return new PasswordAuthentication(username, password.toCharArray());
    }
});

Ancora una volta, questo potrebbe non funzionare per voi perché interessa tutto l'autenticazione nel vostro JVM (HTTP auth, Proxy Auth).

È possibile fornire una fabbrica presa personalizzato, che implementa il protocollo SOCKS, e registrarlo come il vostro gestore di protocollo HTTP predefinito. Questa soluzione ha una limitazione simile a tuergeist di risposta di cui sopra ha - si applica a livello globale, a qualsiasi connessione HTTP si stabilire attraverso HttpClient.

Se si trova questo un problema, dare un'occhiata a questo corrispondenza, dove Oleg suggerisce di utilizzare HttpClient 4.0, ma si riferisce anche ad un eventuale patch nella classe HostConfiguration per HttpClient 3.x.

Un'altra soluzione possibile, che è il mio preferito, è quello di scrivere un proxy HTTP involucro al proxy SOCKS.

Ho cercato

System.setProperty("socksProxyHost", "socks.xyz.com");
System.setProperty("socksProxyPort", "1000");

e sta funzionando bene.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top