HttpURLConnection i htaccess

Dostęp do zasobów za pomocą HttpURLConnection jest prosty, jednak komplikuje się nieco w sytuacji, gdy dany zasób jest zabezpieczony hasłem htaccess (htpasswd).

W takiej sytuacji istnieją 2 rozwiązania. Zgodnie z definicją możemy spróbować ustawić odpowiednie nagłówki, aby przekazać login oraz hasło:

String login    = "";
String password = "";

String encoding = new sun.misc.BASE64Encoder().encode(login + ":" + password.getBytes());
httpCon.setRequestProperty ("Authorization", "Basic " + encoding);
InputStream s = httpCon.getInputStream();

Rzeczą istotną, o której trzeba pamiętać jest to, że całość (login i hasło oddzielone dwukropkiem) muszą być przesłane w kodowaniu base64.

Wszystko by było super, gdyby nie jeden fakt – to nie (zawsze) działa. Drugą opcją jest zatem stworzenie funkcji zarządzającej hasłami w sytuacji, gdy HttpURLConnection natrafi na prośbę o hasło:

String login    = "";
String password = "";

Authenticator.setDefault(new Authenticator(){
  protected PasswordAuthentication getPasswordAuthentication() {
    return new PasswordAuthentication(login, password.toCharArray());
  }
});
	  
HttpURLConnection httpCon = (HttpURLConnection)url.openConnection();

Powyższe rozwiązanie ma dodatkową przewagę nad pierwszą opcją – login i hasło będą przesyłane tylko wtedy, gdy rzeczywiście będą potrzebne. Jeżeli strona nie będzie wymagała ich podania to nie będą przesłane.