E' da tanto tempo che non scrivo un post sul mio blog, trovo l'occasione grazie ad un client che stò sviluppando che permette di eseguire il login su un sito mediante classi standard java.net, anzichè utilizzare librerie note come quella di apache.
In particolare in questo post vedremo come creare un wrapper per eseguire connessioni tramite l'oggetto URLConnection.
Quella che vedremo di seguito è una classe di utilità per la gestione delle richieste http con parametri post e/o invio delle informazioni presenti nei cookies.
Ecco il codice sorgente della classe :
package util;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;
import java.io.OutputStreamWriter;
import java.net.URLConnection;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import util.entity.ResponseWrapper;
/***
* Classe di utilità per l'utilizzo delle connessioni mediante UrlConnection del package java.net
*
*/
public class ConnectionUtils {
/***
* Metodo per eseguire una chiamata http.
* Il metodo richiama un link, passandogli nell'header del pacchetto le informazioni sui parametri
* e le informazioni sui cookies.
* Dopo la chiamata http, recupera le informazioni dei cookies ed il contenuto html della risposta
* e li restituisce in un oggetto modellato per contenere tali informazioni.
*
* @param link : link da chiamare
* @param params : parametri post da passare
* @param cookiesToSend : cookies da inviare nell'header
* @return
*/
public static ResponseWrapper downloadPagePost(String link, Mapparams,List cookiesToSend) {
ResponseWrapper ouputRequest = null;
try {
URL url = new URL(link);
URLConnection conn = url.openConnection();
// mantiene la connessione anche dopo la richiesta
conn.setDoOutput(true);
conn.setRequestProperty("User-Agent","Java1.6 / "+System.getProperty("os.name")+" ("+System.getProperty("os.version")+")");
conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
conn.setRequestProperty("Cookie", CookiesUtils.getMyCookiesString(cookiesToSend));
OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream());
String paramsEncoded = RequestUtils.getEncodedParameters(params);
wr.write(paramsEncoded);
wr.flush();
System.out.println("Call page : "+link);
String headerName = null;
Listcookiesretrieved = new ArrayList ();
for (int i = 1; (headerName = conn.getHeaderFieldKey(i)) != null; i++) {
// System.out.println("------------------");
// System.out.println("header : "+headerName);
// System.out.println("Content : "+conn.getHeaderField(i));
if (headerName.equals("Set-Cookie")) {
String cookie = conn.getHeaderField(i);
//System.out.println("cookie : "+cookie);
// Estraggo il cookie corrente e lo metto nella lista per il wrapper
String currCook = cookie.substring(0, cookie.indexOf(";"));
cookiesretrieved.add(currCook);
} //end if
}
StringBuffer output = new StringBuffer();
BufferedReader rd = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String line;
while ((line = rd.readLine()) != null) {
output.append(line);
}
ouputRequest = new ResponseWrapper(output,cookiesretrieved);
} catch (Exception e) {
e.printStackTrace();
}
return ouputRequest;
}
}
In dipendenza a questa classe è necessario definire la classe ResponseWrapper :
package util.entity;
import java.io.FileWriter;
import java.io.IOException;
import java.util.List;
public class ResponseWrapper {
private Listcookies;
private StringBuffer content;
public ResponseWrapper(StringBuffer acontent,Listcookin){
cookies = cookin;
content = acontent;
}
public ListgetCookies() {
return cookies;
}
public void setCookies(Listcookies) {
this.cookies = cookies;
}
public StringBuffer getContent() {
return content;
}
public void setContent(StringBuffer content) {
this.content = content;
}
public boolean writeToFile(String fileName){
FileWriter out;
try {
out = new FileWriter(fileName);
out.write(getContent().toString());
out.close();
} catch (IOException e) {
return false;
}
return true;
}
}
Questa classe è ha il compito di incapsulare le informazioni recuperate mediante la richiesta http, in particolare l'html contenuto e la lista di cookies generati dal sito.
Definiamo adesso un metodo per eseguire il login a cui passiamo username, password e cookies generati dal sito
public static boolean login(String username, String password,Listcookies){
Mapparametri = new HashMap ();
parametri.put("username",username);
parametri.put("password",password);
parametri.put("otherParam","param");
ResponseWrapper responseLogin = ConnectionUtils.downloadPagePost("mysite.org/login.php", parametri,cookies);
boolean loggedin = true ;// Here we can check login
// write html content to a file named checklogin.html
responseLogin.writeToFile("checklogin.html");
return loggedin;
}
Come utilizzare questo metodo ? Semplice :
Listcookies = new ArrayList ();
cookies.add("PHPSESSID=asd5nkl4nmnskdfjsidd=");
MySampleLogin.login("myUsr","myPasw",cookies);
Spero che la classe vi possa rendere le cose più semplici.
Alla prossima!

0 commenti:
Posta un commento