13.10Verbindungen durch einen Proxy-Server *
In vielen größeren Unternehmen bekommt ein einzelner Client keinen direkten Zugriff auf das Internet. Vielmehr laufen die Verbindungen über eine Zwischenstelle, die Proxy genannt wird. Dieser Proxy cacht zum Beispiel Webseiten und erhöht damit die Performance. Gleichzeitig ist ein Proxy Teil einer wichtigen unternehmensweiten Sicherheitsstrategie. Seiten können geloggt und ausgefiltert werden – welcher Chef möchte schon, dass seine Mitarbeiter laufend Firmenkugelschreiber auf eBay verticken?
13.10.1System-Properties
Java nutzt zur Festlegung der Proxy-Eigenschaften zwei bzw. drei System-Properties, die unter http://tutego.de/go/netproperties genauer beschrieben sind:
Um nun in Applikationen einen Proxy einzusetzen, sind die Eigenschaften zu setzen; eine Möglichkeit besteht über die Kommandozeile mit -D, eine andere über System.setProperty(String, String):
System.setProperty( "proxyHost", "myProxyHost" );
System.setProperty( "proxyPort", "myProxyPort" );
Für Applets sind diese Eigenschaften automatisch über die Browser-Einstellungen gesetzt.
Wenn der Proxy eine Autorisierung erfordert – das ist häufig dann der Fall, wenn der Client einen Fehler mit 407 (authentication required) bekommt –, müssen ihm ein Benutzername und ein Passwort übermittelt werden. Hier gibt es bedauerlicherweise eine ganze Reihe unterschiedlicher Lösungen, die von den Java-Versionen abhängen. Funktionieren sollte im Allgemeinen:
System.setProperty( "http.proxyPassword", "myProxyPasswort" );
Soll ein sicherer Webserver über eine Proxy-Verbindung kontaktiert werden, lassen sich mit installierter Java Secure Socket Extension (JSSE) https.ProxyHost und https.ProxyPort passend setzen.
Im Fall von SOCKS sind die Eigenschaften socksProxyHost für den Server und socksProxyPort für den Port zu setzen. Letzterer steht standardmäßig auf 1080.
13.10.2Verbindungen durch die Proxy-API
Die Einstellungen mit System.setProperty(String, String) sind global und nicht flexibel genug, um verschiedene URLs mit verschiedenen Proxy-Servern anzusprechen. Daher hat Sun eine Proxy-API entworfen, mit der zwei Dinge möglich sind:
Proxy-Objekte repräsentieren einen Proxy-Server und lassen sich später beim Aufbau von Verbindungen angeben. Die Verbindungen laufen anschließend über den Proxy-Server.
Aufzählungen aller Proxy-Server, die einen bestimmten URI behandeln
Ein Proxy-Objekt aufbauen
Ein Proxy-Objekt lässt sich über einen parametrisierten Konstruktor aufbauen. Etwa so:
Proxy proxy = new Proxy( Proxy.Type.HTTP, addr );
Der erste Parameter steht für den Proxy-Typ. Drei Konstanten sind deklariert:
DIRECT: kein Proxy, sondern direkte Verbindung
HTTP: Proxy mit HTTP-Protokoll
SOCKS: SOCKS v4 bzw. v5 Proxy
Verbindungen über Proxy-Server aufbauen
Die Proxy-Objekte sind dann anzugeben, wenn Verbindungen aufgebaut werden, etwa bei URLConnection:
URConnection conn = url.openConnection( proxy );
oder bei Socket:
Proxy-Server für URI ermitteln
Welche Proxy-Server einen bestimmten URI behandeln, ermittelt der ProxySelector. Er liefert für einen URI mit select(URI) eine Liste von Proxy-Objekten:
Listing 13.21com/tutego/insel/net/ListAllProxies.java, main()
for ( Proxy proxy : proxies ) {
System.out.println( "Proxy Typ: " + proxy.type() );
InetSocketAddress addr = (InetSocketAddress) proxy.address();
if ( addr == null )
System.out.println( "Kein Proxy" );
else
System.out.printf( "Proxy Hostname %s und Port %s.",
addr.getHostName(), addr.getPort() );
}
Auch Unterklassen von ProxySelector sind möglich. Damit lässt sich erreichen, dass je nach Kriterium ein eigener Proxy-Server zurückgegeben wird. Die eigene Klasse muss dazu die select(URI)-Methode realisieren.