Documentos de Académico
Documentos de Profesional
Documentos de Cultura
usuario y el uso de
interceptors
Objetivos
• Uso del objeto de sesión para identificar el usuario firmado.
• Uso de Interceptors para mejorar el control de la sesión.
Uso del objeto de sesión
• Cuando estamos desarrollando una aplicación web debemos almacenar información que
será procesada de distinta manera. Dependiendo de cuál sea el propósito de esta
información querremos que tenga un tiempo de vida más corto o más largo, alguna
información deberá permanecer disponible durante todo el momento que viva nuestra
aplicación, mientras que otra solo nos interesará que viva durante una petición.
• Además habrá información que pertenecerá a cada usuario que acceda a la aplicación y
que deberá estar disponible sólo para el usuario correspondiente.
• Estos tiempos de vida son llamados scopes, y en las aplicaciones web tenemos un cierto
número de ellos. Es importante conocer estos scopes y ver qué tipo de información es
conveniente colocar en cada uno de ellos. A la información que colocamos en los
distintos scopes les llamamos atributos.
Uso del objeto de sesión
• Las aplicaciones web con Java tienen básicamente tres scopes o tiempos de vida:
Application: Es el scope más largo ya que abarca el tiempo de vida completo de la apicación;
esto es, los datos vivirán mientras la aplicación esté activa.
Session: Este scope nos permite tener datos que vivirán a lo largo de múltiples peticiones HTTP
para un mismo usuario, mientras el usuario esté dentro de la aplicación. Cada usuario verá
únicamente sus datos y no habrá forma de que vea los de los demás.
Request: Este es el scope más pequeño, los datos asociados con la petición únicamente estarán
disponibles mientras se realiza dicha petición.
• La información o atributos que se puede colocar dentro de estos scopes son pares
nombre valor, en donde el nombre debe ser una cadena y el valor puede ser cualquier
objeto que nosotros queramos.
Uso del objeto de sesión
• Struts 2 nos proporciona tres formas para colocar y leer los atributos que se encuentren
en estos scopes:
Implementación de interfaces Aware
Uso del objeto "ActionContext"
Uso del objeto "ServletActionContext"
• Las tres son igual de sencillas y nos permiten obtener más o menos los mismos
resultados.
• Además podemos usar dos de los métodos anteriores, las interfaces Aware y el objeto
"ServletActionContext", para obtener acceso directo a los objetos "HttpServletRequest"
y "ServletContext"
Uso del objeto de sesión
• Struts 2 proporciona un conjunto de interfaces llamadas interfaces Aware. La mayoría de
estas interfaces proporcionan un Map con los pares nombre valor de los atributos de
cada uno de los scopes.
• Struts 2 contiene las siguientes interfaces Aware para obtener y leer atributos de los
scopes:
ApplicationAware
SessionAware
RequestAware
Uso del objeto de sesión
• Vamos a implementar el manejo de la sesión, en nuestro Login. De tal forma que si
el usuario existe en la base de datos, agregamos su información a la sesión.
• Para ello es necesario modificar la clase LoginAction para que implemente la
interface SessionAware.
@Override
public String intercept(ActionInvocation actionInvocation) throws Exception
{
String result = Action.LOGIN;
if (actionInvocation.getInvocationContext().getSession().containsKey("usuario"))
{
result = actionInvocation.invoke();
}
return result;
}
Crear un interceptor para verificar la
sesión
• Primero asumimos que el usuario no se ha logueado, así que usamos la constante
"LOGIN" de la interface "Action" como valor inicial de la variable que regresaremos en
el interceptor.
• Verificamos, usando el mapa de sesión que obtenemos a través del objeto
"ActionInvovation", si existe el usuario en sesión.
• Si el usuario existe, entonces ejecutamos el Action y regresamos el valor que
obtengamos de la ejecución de su método "execute", en caso contrario este será enviado
al formulario de login.
• Ya teniendo nuestro interceptor podemos configurarlo en el archivo "struts.xml"
Crear un interceptor para verificar la
sesión
• Ahora bien, para todo trabajo relacionado con interceptores el archivo "struts.xml" tiene
una sección especial dentro del elemento "<interceptors>".
• Dentro de este elemento podemos declarar interceptores nuevos o crear nuevas
pilas(stacks). Para esto último usamos los elementos "<interceptor-stack>" y
"<interceptor-ref>".
• Primero vamos a crear un nuevo paquete llamado “general”. En el cual vamos a incluir
todos los action excepto el LoginAction.
<package name="general" namespace="/" extends="struts-default">
• Este nuevo paquete será el paquete al que le incluiremos el interceptor que acabmos de
crear en el paso anterior, para que en caso de que se llame algún action de este paquete,
valide primero si el usuario está firmado.
Crear un interceptor para verificar la
sesión
• Antes del primer tag de action dentro de este package, vamos a incluir lo siguiente:
<interceptors>
<interceptor-stack name="newStack">
<interceptor-ref name="loginInterceptor"/>
<interceptor-ref name="defaultStack" />
</interceptor-stack>
</interceptors>
• Aquí, estamos declarando un nuevo interceptor global utilizando el elemento… "<interceptor>". Este
elemento tiene dos atributos: "name", en el que se indica cuál será el nombre que se use para hacer
referencia a este interceptor y "class", en el que se indica cuál clase implementa la funcionalidad de este
interceptor.
• Adicionalmente, creamos un nuevo stack de interceptores en donde incluímos primero nuestro nuevo
interceptor y posteriormente el defaultStack de struts
Crear un interceptor para verificar la
sesión
• Si lo hicimos correctamente, nuestro struts.xml debe
verse de la siguiente manera
Crear un interceptor para verificar la
sesión
• Cabe señalar que struts aplica por default a todos los Actions se nuestra aplicación la
pila de interceptores definida en "defaultStack". Esta pila aplicará estos interceptores, en
el orden siguiente:
• exception
• alias
• servletConfig
• prepare
• i18n
• chain
• debugging
• profiling
• scopedModelDriven
• modelDriven
• fileUpload
• checkbox
• staticParams
• conversionError
• validation
• workflow
Práctica
• Entregar el ejemplo con el manejo se sesión y el uso de interceptors para controlar el acceso.