Archive

Author Archive

Promemoria: Installare Ant su Windows

May 11th, 2011 No comments
  • Scaricare e scompattare lo zip dall’url: http://ant.apache.org/
  • Aggiungere nel path il percorso alla cartella bin (es: C:\Sviluppo\javalib\apache-ant-1.8.1\bin)
  • Aggiungere se non esiste ancora la variabile di ambiente JAVA_HOME con il relativo percorso al jdk

Fatto.
Per verificare se è tutto corretto, creare una directory vuota e al suo interno un file chiamato build.xml fatto così:

<!--?xml version="1.0"?-->
<project name="TestAnt" default="test" basedir=".">
	<target name="test" description="Test Ant">
		<delete dir="./src" quiet="true"/>
		<mkdir dir="./src" />
	</target>
</project>

Aprite una shell, entrare nella directory e digitate ant. Il risultato dovrebbe essere:

Buildfile: C:\Sviluppo\testant\build.xml

test:
    [mkdir] Created dir: C:\Sviluppo\testant\src

BUILD SUCCESSFUL
Total time: 1 second

Avete semplicemente creato una directory src e Ant funziona.

Categories: Ant, Programmazione Tags: , ,

Struts2 e Tiles2: esempio di logging tramite interceptor

April 17th, 2011 No comments

Scarica il progetto di esempio (Eclipse Helios)

Questo è un esempio di come si può definire la fase di autenticazione e di controllo dell’autenticazione stessa tramite un interceptor. L’interceptor che andrò a definire farà queste cose:

- verifica che nella sessione sia presente un oggetto UTENTE
- se non è presente verifica che la navigazione provenga dalla pagina di login.
- se si proviene dalla pagina di login controlla utente/password e li autentica
- in tutti gli altri altri casi redirige alla pagina di login

Tutto questo avviene prima della visita di ogni pagina, proprio per la definizione stessa di interceptor. Ecco come può essere il metodo intercept dell’interceptor:

public String intercept (ActionInvocation invocation) throws Exception {
 
	// Dall'action context ho accesso agli oggetto request e quindi session
    final ActionContext context = invocation.getInvocationContext ();
    HttpServletRequest request = (HttpServletRequest) context.get(StrutsStatics.HTTP_REQUEST);
    HttpSession session =  request.getSession (true);
 
    // Se nella sessione c'è un oggetto chiamato "UTENTE" sognifica che sono già loggato
    Object user = session.getAttribute ("UTENTE");
    if (user == null) {
 
    	// Non c'è nessun utente autenticato. Per verificare se provengo dalla form di login, verifico che ci sia un parametro
    	// "login" nella request e che sia diverso dalla stringa vuota.
 
        // Verifico di stare provenendo dalla form login
        String login = request.getParameter ("login") != null ? request.getParameter ("login").toString() : "";
        if (! login.equals("") ) { // L'utente sta cercando di loggarsi.
 
    		String request_user = request.getParameter ("USERNAME") != null ? request.getParameter ("USERNAME").toString() : "";
    		String request_password = request.getParameter ("PASSWORD") != null ? request.getParameter ("PASSWORD").toString() : "";
 
    		boolean autenticato = false;
    		Personaggio utente = null;
    		// Qui dovrà esserci una vera autenticazione
    		if ("paperino".equals(request_user) && "paperino".equals(request_password)) {  
    			utente = new Personaggio("Paperino", new String[]{"Cioccolata","Sigarette"});
    			autenticato = true;
    	    }
    	    else if ("pippo".equals(request_user) && "pippo".equals(request_password)) {  
    			utente = new Personaggio("pippo", new String[]{"Noccioline","Fiches"});
    			autenticato = true;
    	    }	    		
 
    		if (autenticato) {
    			// Se sono autenticato salvo nella sessione l'oggetto UTENTE
	        	session.setAttribute("UTENTE", utente);
    			return "login-success";		        	
    		} else // Non sono autenticato, rimango nella login
    			return "login";
        }
 
        // Se sono arrivato qui significa che non provenivo dalla form di login
        return "login";
    } else { // Sono già loggato, lascio passare 
        return invocation.invoke ();
    }
}

In questo esempio, se non sono già autenticato e l’autenticazione va a buon fine, creo un mio oggetto Personaggio, lo instanzio e lo metto nella sessione. Da questo punto in poi, ogni volta che l’interceptor verrà chiamato, mi lascerà passare senza fare nulla.

Nel file struts.xml vado a dichiarare il nuovo interceptor, e ad appenderlo allo stack standard. Utilizzo anche due global result, login e login-success, che vengo chiamati in caso di non autenticazione e di autenticazione avvenuta con successo:

<package name="default" extends="struts-default" namespace="/">
	<result-types>
		<result-type name="tiles"
			class="org.apache.struts2.views.tiles.TilesResult" />
	</result-types>
 
	<!-- 
		Questa è la sezione dedicata agli interceptor  
	-->  
	<interceptors>
 
		<!-- 
			Definisco l'interceptor login 
		-->
		<interceptor name="login"
			class="topolinia.interceptors.LoginInterceptor" />
 
		<!-- 
			Creo uno stack di interceptor semplicemente aggiungendo
			a quello di default il mio 
		-->
		<interceptor-stack name="defaultLoginStack">
			<interceptor-ref name="defaultStack" />
			<interceptor-ref name="login" />
		</interceptor-stack>
 
	</interceptors>
 
	<!--
		Tutte le action utilizzeranno di default il mio nuovo stack,
		a meno che non sia specificato diversamente nella loro definizione
	-->
	<default-interceptor-ref name="defaultLoginStack" />
 
	<!-- L'aciont di default in caso di errore -->
	<default-action-ref name="index" />
 
	<!-- 
		Questi due global result vengono chiamati dall'interceptor che
		effettua il login	
	 -->
	<global-results>
		<result type="tiles" name="login">login</result>
		<result type="redirectAction" name="login-success">index</result>
	</global-results>
 
	<action name="index" class="topolinia.action.Topolinia" method="home">
		<result type="tiles">home</result>
	</action>
 
	<action name="logout" class="topolinia.action.Topolinia" method="logout">
		<result type="tiles" name="success">login</result>
	</action>
 
</package>

Tralasciando il fatto che utilizzo tiles2, e che quindi il global-result login è definito nel file tiles.xml, la pagina di login avrà un campo hidden di nome “login”, che serve all’interceptor per capire se stiamo venendo proprio da questa pagina:

<%@ taglib prefix="s" uri="/struts-tags"%>
 
<form action="index" method="post" >
	<s:hidden name="login" value="%{'1'}" />
	<s:textfield name="USERNAME" id="USERNAME" label="Nome" />
	<s:textfield name="PASSWORD" id="PASSWORD" label="Password" />
	<s:submit value="Login" align="center" />
</form>

Da notare che non c’è nessuna action che li si chiama “login”, perchè è l’ìnterceptor che gestisce sia la parte di login che la parte di controllo, su ogni pagina visitata, della corretta autenticazione. In questo progetto di esempio è quindi l’action index quella che prima viene invocata nel caso di autenticazione avvenuta con successo.

Ho inserito anche una action per eseguire il logout, molto semplice, che non fa altro che invalidare la sessione:

public String logout() throws Exception {
 
	HttpSession session = request.getSession();
	session.invalidate();		
 
	return SUCCESS;
}

Scarica il progetto di esempio (Eclipse Helios)

Categories: Java, Struts, Web Tags: , , ,

Struts2: esempio di utilizzo del tag s:iterator

April 9th, 2011 No comments

Scarica il progetto di esempio (Eclipse Helios).

Ho creato un semplice progetto che mi è servito per capire meglio come funzionano i tags s:iterator e s:property. Innanzi tutto si parla di struts2 integrato con Tiles2.
In questo esempio, ho creato una struttura dati molto semplice:

 
package topolinia.model;
 
public class Personaggio {
 
	String nome;
	public String getNome() {
		return nome;
	}
	public void setNome(String nome) {
		this.nome = nome;
	}
 
	String[] oggetti;
	public String[] getOggetti() {
		return oggetti;
	}
	public void setOggetti(String[] oggetti) {
		this.oggetti = oggetti;
	}
 
	public Personaggio(String nome, String[] oggetti) {
		this.nome = nome;
		this.oggetti = oggetti;
	}
}

Nella classe che gestisce le actions dichiaro un array di oggetti come sopra, specificando i get/set per renderli visibili alla jsp, oltre ai metodi che mappano le actions:

package topolinia.action;
 
import topolinia.model.Personaggio;
 
import com.opensymphony.xwork2.ActionSupport;
 
@SuppressWarnings("serial")
public class Topolinia extends ActionSupport {
 
	private Personaggio io;
	public void setIo(Personaggio io) {
		this.io = io;
	}
 
	public Personaggio getIo() {
		return io;
	}
 
	private Personaggio[] amici;
	public void setAmici(Personaggio[] amici) {
		this.amici = amici;
	}
 
	public Personaggio[] getAmici() {
		return amici;
	}	
 
	public String paperino() throws Exception {
 
		setIo(new Personaggio("Paperino", new String[]{"Cioccolata","Sigarette"}));
 
		setAmici(new Personaggio[]{new Personaggio("Pippo", new String[]{"Noccioline","Fiches"}),
								   new Personaggio("Topolino", new String[]{"Carte","Apribottiglie"})});
 
		return SUCCESS;
	}
 
	public String pippo() throws Exception {
 
		setIo(new Personaggio("Pippo", new String[]{"Noccioline","Bicchiere"}));
 
		setAmici(new Personaggio[]{new Personaggio("Paperino", new String[]{"Cioccolata","Sigarette"}),
				                   new Personaggio("Topolino", new String[]{"Carte","Apribottiglie"})});
		return SUCCESS;
	}
}

nel file struts.xml le due classi sono descritte molto semplicemente in questo modo:

<action name="paperino" class="topolinia.action.Topolinia" method="paperino" >
	<result type="tiles" name="success">personaggio_page</result>
</action>
 
<action name="pippo" class="topolinia.action.Topolinia"  method="pippo" >
	<result type="tiles" name="success">personaggio_page</result>
</action>

e questa è la jsp che visualizza i dati:

<p>
Ciao, io sono <s:property value="io.nome"/>, i miei oggetti sono: <s:property value="io.oggetti"/>
</p>
 
<p>Questi sono i miei amici (e i loro oggetti):</p>
<ul>
<s:iterator value="amici">
  <li><s:property value="nome"/> (<s:property value="oggetti"/>)</li>
</s:iterator>
</ul>
 
 
<p>Questi è un altro modo di visualizzare i miei amici (e i loro oggetti):</p>
<ul>
<s:iterator value="amici">
  <li><s:property value="nome"/> </li>
  <ul>
	  <s:iterator value="oggetti">
		<li><s:property /></li>
	  </s:iterator>
  </ul>
</s:iterator>
</ul>

Il risultato è (…tenetevi forte…) questo:

Scarica il progetto di esempio (Eclipse Helios).

Categories: Java, Struts Tags: , , ,

Ubuntu e apt-get: impostare il proxy con autenticazione

April 6th, 2011 No comments

Assicuratevi di avere una riga fatta così nel file /etc/apt/apt.conf:


Acquire::http::proxy "http://DOMINIO\utente:password@proxy.azienda.it:PORTA/";

Categories: Linux, Ubuntu 10.4 Tags: , ,

Apache Http Client 4.1: Creare una connessione https validando tutti i certificati

April 4th, 2011 1 comment

Questo pezzo di codice crea una connessione https considerando validi tutti i certificati che arrivano dal server:

HttpClient httpclient = new DefaultHttpClient();
 
// creo un array di TrustManager per considerare tutti i certificati server validi		
X509TrustManager tm = 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 {
	// Creo il contesto SSL utilizzando i trust manager creati			
	SSLContext ctx = SSLContext.getInstance("TLS");
	ctx.init(null, new TrustManager[]{tm}, null);
 
	// Creo la connessione https
	SSLSocketFactory ssf = new SSLSocketFactory(ctx, SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);			
	ClientConnectionManager ccm = httpclient.getConnectionManager();
	SchemeRegistry sr = ccm.getSchemeRegistry();
	sr.register(new Scheme("https", 443, ssf));
	httpclient = new DefaultHttpClient(ccm, httpclient.getParams());
 
} catch (NoSuchAlgorithmException e) {
	e.printStackTrace();		
} catch (KeyManagementException e) {
	e.printStackTrace();		
}
 
try {
	// Ora ad esempio eseguiamo una post:
	HttpPost post = new HttpPost("https://unbellinkhttpsconunbelcertificato.com");
	HttpResponse response = httpclient.execute(post);		
} catch (UnsupportedEncodingException e) {
	repres.errorMessage = e.getMessage();
} catch (ClientProtocolException e) {
	repres.errorMessage = e.getMessage();
} catch (ParseException e) {
	repres.errorMessage = e.getMessage();
} catch (IOException e) {
	repres.errorMessage = e.getMessage();
}