Tip Struts 2 #14: Gestión de cookies

04/05/2014
struts2 tip

Trabajar con cookies en Java es sencillo gracias a la clase Cookie. Para facilitar aún más el trabajo, Struts 2 proporciona los interceptores CookieInterceptor y CookieProvider incluidos en el core de Struts 2.

Nota: Debido a un error de seguridad si se utiliza CookieInteceptor hay que utilizar la última versión de Struts 2 (2.3.16.3).

Escribir cookies

Para escribir o enviar cookies al navegador hay que habilitar el interceptor CookieProvider y hacer que la clase Action implemente la intefaz CookieProvider lo que obliga a implementar un único método que devuelve un Set con las cookies.

<action name="writeCookies" class="com.danielme.tips.struts2.tip14.actions.MainAction">
  <interceptor-ref name="defaultStack"/>
  <interceptor-ref name="cookieProvider"/>
  <result name="success">/jsp/form.jsp</result>			
</action>
package com.danielme.tips.struts2.tip14.actions;

import java.util.HashSet;
import java.util.Set;

import javax.servlet.http.Cookie;

import org.apache.struts2.interceptor.CookieProvider;

import com.opensymphony.xwork2.ActionSupport;

public class MainAction extends ActionSupport implements CookieProvider
{
	private static final long serialVersionUID = 1L;

	public String execute() 
	{
        return SUCCESS;
    }
	
	@Override
	public Set<Cookie> getCookies()
	{
		Set<Cookie> cookies = new HashSet<Cookie>(10);
		for (int i = 0 ;i < 10; i++)
		{
			cookies.add(new Cookie("tip14cookie_" + i, "value" + i));			
		}
		return cookies;
	}	

}

El método getCookies se ejecuta después del Action (en este ejemplo el método execute). Podemos comprobarlo si tenemos configurado el log a nivel DEBUG para el interceptor.

DEBUG org.apache.struts2.interceptor.CookieProviderInterceptor:72 - Sending cookie [tip14cookie_8] with value [value1] for domain [no domain]

Leer cookies

Para leer cookies utilizamos el interceptor CookieInterceptor que requiere, al menos, los siguientes parámetros:

  • cookiesName: nombres de las cookies, separados por comas, candidatas a ser leídas. Usar asterisco para todas.
  • cookiesValue: valores posibles de las cookies, separados por comas, candidatas a ser leídas. Usar asterisco para todas.

Así pues, para leer dos de las cookies que hemos creado por su nombre e ignorando su valor se podría utilizar por ejemplo esta configuración:

<action name="readCookies" class="com.danielme.tips.struts2.tip14.actions.MainAction">
  <interceptor-ref name="defaultStack"/>     
  <interceptor-ref name="cookie">
    <param name="cookiesName">tip14cookie_0,tip14cookie_1</param>
    <param name="cookiesValue">*</param>
  </interceptor-ref>
  <result name="success">/jsp/form.jsp</result>			
</action>	

Para recoger las cookies necesitamos un setter con el nombre de la cookie, si este setter no existe se lanzará una excepción (No object in the CompoundRoot has a publicly accessible property named ‘tip14cookie_0’ (no setter could be found)). Estos setter se invocarán antes del método del Action (en nuestro caso execute).

package com.danielme.tips.struts2.tip14.actions;

import com.opensymphony.xwork2.ActionSupport;

public class MainAction extends ActionSupport
{
	private static final long serialVersionUID = 1L;
	
	private String tip14cookie_0;
	
	private String tip14cookie_1;

	public String execute() 
	{
        return SUCCESS;
    }	

	public String getTip14cookie_0()
	{
		return tip14cookie_0;
	}


	public void setTip14cookie_0(String tip14cookie_0)
	{
		this.tip14cookie_0 = tip14cookie_0;
	}


	public String getTip14cookie_1()
	{
		return tip14cookie_1;
	}


	public void setTip14cookie_1(String tip14cookie_1)
	{
		this.tip14cookie_1 = tip14cookie_1;
	}	
}

Existe la posibilidad de recibir todas las cookies leídas por el interceptor en un único Map haciendo que el Action implemente la interfaz CookiesAware. No obstante, sigue siendo obligatorio crear el setter para cada cookie.

El proyecto completo para Maven se encuentra en Github. Para más información sobre cómo utilizar GitHub, consultar este artículo.

<< TIPS STRUTS 2

Deja una respuesta

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Salir /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Salir /  Cambiar )

Conectando a %s

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.