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ę”.