Net proxy w Javie i hasełka
Sieć firmowa to taki wytwór chorej wyobraźni, który ma za zadanie odcinać nas od GG (nie boli), torrentów (boli, bo obecnie wszystkie distro linuxa najszybciej pobrać z torrentów), Skype (boli, bo to jednak dobry komunikator) i stron z tutkami (bardzo boli), które mają pecha być na innym porcie niż 80/443. Sieć ta zazwyczaj wymaga przejścia przez proxy żeby móc zanurzyć się w sieci. Zablokowanych portów nie przeskoczymy, ale czasami chcemy z poziomu aplikacji w Javie skorzystać z zasobów w sieci. Jak skonfigurować proxy to wie każdy. Jak dodać autoryzacje po haśle możecie zobaczyć poniżej.
Listing 1. Klasa do obsługi Proxy
import java.net.Authenticator;
import java.net.PasswordAuthentication;
/**
* Klasa pozwala na szybką i łatwą konfigurację dostępu przez proxy.
*
* @author bartlomiejk
*
*/
public class NetProxy {
/**
* Klasa reprezentuje konfigurację dla żądań HTTP na standardowym porcie 80.
*
* @author bartlomiejk
*
*/
public static class HttpProxy extends ProxyConfig {
/**
* Tworzy konfigurację.
*
* @param address
* adres serwera proxy.
*/
public HttpProxy(final String address) {
super(address, "80");
}
/*
* (non-Javadoc)
*
* @see google.search.NetProxy.ProxyConfig#init()
*/
@Override
public void init() {
System.setProperty(HTTP_PROXY_HOST, address);
System.setProperty(HTTP_PROXY_PORT, port);
}
}
/**
* Klasa reprezentuje konfigurację dla żądań HTTPS na standardowym porcie 443.
*
* @author bartlomiejk
*
*/
public static class HttpsProxy extends ProxyConfig {
/**
* Tworzy konfigurację.
*
* @param address
* adres serwera proxy.
*/
public HttpsProxy(final String address) {
super(address, "443");
}
/*
* (non-Javadoc)
*
* @see google.search.NetProxy.ProxyConfig#init()
*/
@Override
public void init() {
System.setProperty(HTTPS_PROXY_HOST, address);
System.setProperty(HTTPS_PROXY_PORT, port);
}
}
/**
* Klasa reprezentuje konfigurację serwera proxy. Rozszerz ją jeżeli chesz wykorzystywać np.
* niestandardowe porty (80 dla HTTP i 443 dla HTTPS).
*
* @author bartlomiejk
*
*/
public static abstract class ProxyConfig {
/**
* Flaga - host HTTP
*/
protected static final String HTTP_PROXY_HOST = "http.proxyHost";
/**
* Flaga - port HTTP
*/
protected static final String HTTP_PROXY_PORT = "http.proxyPort";
/**
* Flaga - host HTTPS
*/
protected static final String HTTPS_PROXY_HOST = "https.proxyHost";
/**
* Flaga - port HTTPS
*/
protected static final String HTTPS_PROXY_PORT = "https.proxyPort";
/**
* Adres serwera proxy
*/
protected final String address;
/**
* Port, który obsługuje proxy.
*/
protected final String port;
/**
* Tworzy konfigurację
*
* @param address
* Adres serwera proxy
* @param port
* Port, który obsługuje proxy.
*/
public ProxyConfig(final String address, final String port) {
super();
this.address = address;
this.port = port;
}
/**
* Metoda ustawia parametry. Musisz ją zaimplementować tak by ustawiała odpowienie flagi
* systemowe.
*/
public abstract void init();
}
/**
* Klasa zawierajaca dane dotyczące autentyfikacji na serwerze proxy.
*
* @author bartlomiejk
*
*/
public static class StandardAuthenticator extends Authenticator {
/**
* Informacje autentyfikacyjne.
*/
private PasswordAuthentication passwordAuthentication;
/**
* Konfiguruje informacje.
*
* @param userName
* nazwa użydkownika na serwerze proxy.
* @param password
* haslo na serwerze proxy.
*/
public StandardAuthenticator(final String userName, final String password) {
passwordAuthentication = new PasswordAuthentication(userName, password.toCharArray());
}
protected PasswordAuthentication getPasswordAuthentication() {
return passwordAuthentication;
}
}
/**
* Konfiguruje ustawienia proxy dla danej instancji JVM.
*
* @param authenticator
* informacje do autentyfikacji. Może być ```
null
``` W takim wypadku nie jest
* ustawiane.
* @param proxyConfigs
* konfiguracja proxy.
*/
public static void init(final Authenticator authenticator, final ProxyConfig... proxyConfigs) {
if (authenticator != null)
Authenticator.setDefault(authenticator);
for (ProxyConfig pc : proxyConfigs)
pc.init();
}
/**
* JVM będzie próbowal użyć ustawien systemowych proxy. Zazwyczaj nie jest to dobry pomysł.
*/
public static void useSystemProxy() {
System.setProperty("java.net.useSystemProxies", "true");
}
}
Licencja Apache 2/beerware.
Co do wymyślania koła od nowa – w sieci jest wiele tutoriali z opisem JAK skonfigurować proxy, ale nie znalazłem klasy/biblioteki, która by to robiła od ręki przesłaniając całą „magię”.