Wie kann ich configure Httpclient gegen einen SOCKS-Proxy authentifizieren?
-
21-09-2019 - |
Frage
ich brauche Proxy-Authentifizierung gegen einen SOCKS-Proxy einzurichten. Ich fand heraus, diesen Beitrag Anweisungen geben, die Arbeit mit gängigen HTTP-Proxies erscheinen.
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);
Würde das mit SOCKS Proxies auch oder habe ich etwas anderes zu tun?
Lösung
Die Eigenschaften von Apache Httpclient sagt:
Transparente Verbindungen über SOCKS-Proxies (Version 4 und 5) mit nativen Java Socket-Unterstützung.
Mit „transparent“, ich glaube, sie meinen, dass es funktioniert, ohne dass Sie etwas Besonderes zu tun. Haben Sie einen SOCKS-Proxy verfügbar irgendwo? Können Sie nicht versuchen, es einfach zu sehen, ob es funktioniert?
Andere Tipps
Java unterstützt Socks-Proxy-Konfiguration über Vorlieben:
-
socksProxyHost
für den Hostnamen des SOCKS-Proxy-Server -
socksProxyPort
für die Portnummer, der Standardwert ist1080
z.
java -DsocksProxyHost=socks.mydomain.com
( Bearbeiten ) Für Ihr Beispiel, wenn der SOCKS-Proxy in der Art und Weise vor skizzierte konfiguriert wurde:
httpclient.getHostConfiguration().setProxy("proxyserver.example.com", 8080);
Credentials cred = new UsernamePasswordCredentials("username","password");
httpclient.getState().setProxyCredentials(AuthScope.ANY, cred);
Sie können auch diese Variante verwenden (ohne Httpclient):
SocketAddress addr = new
InetSocketAddress("webcache.mydomain.com", 8080);
Proxy proxy = new Proxy(Proxy.Type.SOCKS, addr); // Type.HTTP for HTTP
So das vorherige Beispiel abgeschlossen haben, können wir jetzt hinzufügen:
URL url = new URL("http://java.sun.com/");
URConnection conn = url.openConnection(proxy);
HTH
SOCKS wird nicht von Httpclient 3 nativ unterstützt. Sie können versuchen, die SOCKS in JDK unterstützen, wie von anderen vorgeschlagen. Der Nebeneffekt ist, dass Ihre ganze JVM durch den gleichen SOCKS-Proxy gehen wird.
Java 5 unterstützt Benutzername / Passwort-Authentifizierung in SOCKS (Typ 2). Alles, was Sie zu Setup zu tun haben, der Authentifikator wie diese,
Authenticator.setDefault(new Authenticator() {
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(username, password.toCharArray());
}
});
Auch dies möglicherweise nicht für Sie, weil sie alle Authentifizierung in Ihrer JVM betrifft (HTTP Auth, Proxy Auth).
Sie können bieten eine benutzerdefinierte Steckdose Fabrik, die Geräte das SOCKS-Protokoll, und registrieren Sie es als Standard-HTTP-Protokollhandler. Diese Lösung hat eine Einschränkung ähnlich wie tuergeist Antwort oben hat - es gilt global, auf jede HTTP-Verbindung, die Sie durch Httpclient etablieren werden.
Wenn Sie dies ein Problem finden, werfen Sie einen Blick auf
Ich habe versucht, und es funktioniert gut. System.setProperty("socksProxyHost", "socks.xyz.com");
System.setProperty("socksProxyPort", "1000");