Jednoduchá ukázka připojení a autorizace pod protokolem HTTPS.
Vytvořit klasické spojení s URL adresou v protokolu HTTP není zřejmě žádný problém. Když se k tomu přidá nutná autorizace uživatele a navíc protokol HTTPS, připojení se může zkomplikovat.
Spojení a autorizace pod protokolem HTTPS je podobné jako pod klasickým HTTP. Rozdíl je v přijetí certifikátu a HTTPS komunikaci.
Výsledná třída má tři vstupní parametry:
Pro připojení k URL adrese slouží metoda private HttpsURLConnection connection(), která vrací identifikátor spojení:
private HttpsURLConnection connection() {
URL senddata;
try {
//vytvoreni nove URL
senddata = new URL(this.url);
HttpsURLConnection con = null;
try {
//otevreni url
con = (HttpsURLConnection) senddata.openConnection();
} catch (IOException e) {
e.printStackTrace();
}
//vraci ID spojeni
return con;
} catch (MalformedURLException e) {
e.printStackTrace();
}
return null;
}
Metoda vrací identifikátor spojení, na jehož základě můžeme provést autorizaci k danému serveru.
Pro autorizaci slouží Metoda private void authorization(HttpsURLConnection con), která se na základě zadaného přihlašovacího jména a hesla pokusí připojit:
//autoriaze
private void authorization(HttpsURLConnection con) {
//priprava dat pro identifikaci uzivatele
String userPassword = this.LoginName + ":" + this.LoginPassword;
//zakodovani dat do BASE64
String encoding = new sun.misc.BASE64Encoder().encode(userPassword
.getBytes());
//odeslani hlavicky
con.setRequestProperty("Content-Type",
"application/x-www-form-urlencoded");
//identifikace uzivatele
con.setRequestProperty("Authorization", "Basic " + encoding);
}
Pokud se připojení nezdaří, je vrácena chyba:
Server returned HTTP response code: 401 for URL: https://url
Pro ukázku použití je v Main umístěn kód, který načte obsah připojené url adresy:
autorizace auth = new autorizace(url, loginname, password);
HttpsURLConnection con = auth.getConnection();
DataInputStream in = null;
try {
in = new DataInputStream(con.getInputStream());
} catch (IOException e) {
e.printStackTrace();
}
BufferedReader br = new BufferedReader(new InputStreamReader(in));
try {
String strLine = br.readLine();
System.out.print(strLine);
} catch (IOException e) {
e.printStackTrace();
}
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
Celý zdrojový kód je zde:
import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.ProtocolException;
import java.net.URL;
import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSession;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
public class autorizace {
//private variables
private String url;
private String LoginName;
private String LoginPassword;
//public variables
public HttpsURLConnection urlConnection;
//konstruktor
public autorizace(String url, String LoginName, String LoginPassword) {
//nastaveni promennych
this.url = url;
this.LoginName = LoginName;
this.LoginPassword = LoginPassword;
this.run();
}
private void run(){
//implementace TrustManageru
TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() {
public java.security.cert.X509Certificate[] getAcceptedIssuers() {
return null;
}
public void checkClientTrusted(
java.security.cert.X509Certificate[] certs, String authType) {
}
public void checkServerTrusted(
java.security.cert.X509Certificate[] certs, String authType) {
}
} };
try {
SSLContext sc = SSLContext.getInstance("SSL");
HostnameVerifier hv = new HostnameVerifier() {
public boolean verify(String urlHostName, SSLSession session) {
return true;
}
};
HttpsURLConnection.setDefaultHostnameVerifier(hv);
sc.init(null, trustAllCerts, new java.security.SecureRandom());
HttpsURLConnection
.setDefaultSSLSocketFactory(sc.getSocketFactory());
} catch (Exception e) {
try {
throw e;
} catch (Exception e1) {
e1.printStackTrace();
}
}
//nove https spojeni
HttpsURLConnection con = null;
//pripojeni k url adrese
if ((con = this.connection()) == null) {
System.exit(1);
}
con.setDoOutput(true);
try {
con.setRequestMethod("POST");
} catch (ProtocolException e1) {
e1.printStackTrace();
}
con.setDoInput(true);
//zavolani metody pro autorizaci
this.authorization(con);
this.urlConnection = con;
}
//metoda vraci httpsurlconnection
public HttpsURLConnection getConnection() {
return this.urlConnection;
}
//autoriaze
private void authorization(HttpsURLConnection con) {
//priprava dat pro identifikaci uzivatele
String userPassword = this.LoginName + ":" + this.LoginPassword;
//zakodovani dat do BASE64
String encoding = new sun.misc.BASE64Encoder().encode(userPassword
.getBytes());
//odeslani hlavicky
con.setRequestProperty("Content-Type",
"application/x-www-form-urlencoded");
//identifikace uzivatele
con.setRequestProperty("Authorization", "Basic " + encoding);
}
//pripojeni k url adrese
private HttpsURLConnection connection() {
URL senddata;
try {
//vytvoreni nove URL
senddata = new URL(this.url);
HttpsURLConnection con = null;
try {
//otevreni url
con = (HttpsURLConnection) senddata.openConnection();
} catch (IOException e) {
e.printStackTrace();
}
//vraci ID spojeni
return con;
} catch (MalformedURLException e) {
e.printStackTrace();
}
return null;
}
public static void main(String[] args) {
String url = "https://www.stag.utb.cz/apps/stag/portal/";
String loginname = "a0460";
String password = "autobus";
autorizace auth = new autorizace(url, loginname, password);
HttpsURLConnection con = auth.getConnection();
DataInputStream in = null;
try {
in = new DataInputStream(con.getInputStream());
} catch (IOException e) {
e.printStackTrace();
}
BufferedReader br = new BufferedReader(new InputStreamReader(in));
try {
String strLine = br.readLine();
System.out.print(strLine);
} catch (IOException e) {
e.printStackTrace();
}
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}