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(); } } }
Štítky: autorizace, https, Java
Zaachi blog využívá WordPress MU a běží na Blog.zive.cz. Vytvořte si svůj vlastní blog
Sledování přes RSS: články
a komentáře