Está en la página 1de 22

Manejo de sesión del

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.

• Esto nos obliga a implementar el método setSession.


Uso del objeto de sesión
• Ahora hay que modificar el código de Login, para que una vez autenticado el
usuario, se almacene su objeto en la sesión:
if (null != user) {
session.put("usuario", user);
ret = SUCCESS;
}

• Posteriormente modificamos MenuAction (o cualquier otro action) para que


obtenga el objeto de sesión y si este no existe, se genere un error.
Uso del objeto de sesión
• Esto implica que en todos nuestros actions tenemos que obtener el usuario firmado
y en caso de que no exista en la sesión tendremos que enviar error.

• Es una forma de hacerlo, pero no necesariamente la mejor, para ello es mejor


utilizar un Interceptor.
Uso de Interceptors.
• Al desarrollar una aplicación, es necesario desarrollar algunas funcionalidades de
utilidad que nos hagan más fácil el desarrollo de los procesos de negocio en los cuales
estamos interesados.
• Algunos ejemplos de estas funcionalidades pueden ser el verificar que el usuario haya
iniciado una sesión en el sistema, o que tenga permisos para ejecutar la operación que
está solicitando, convertir los parámetros de un tipo a otro (de String a Date, o a int),
verificar que se hayan proporcionado los datos que son obligatorios, agregar alguna
información a la sesión del usuario, etc.
• La mayoría de estas funcionalidades pueden ser creadas de una forma genérica y usadas
en varias partes de nuestra aplicación o en varias aplicaciones.
Uso de Interceptors.
• Los interceptores son clases que siguen el patrón interceptor. Estos permiten que se
implementen funcionalidades "cruzadas" o comunes para todos los Actions, pero que se ejecuten
fuera del Action (por ejemplo validaciones de datos, conversiones de tipos, población de datos,
etc.).
• Los interceptores realizan tareas antes y después de la ejecución de un Action y también pueden
evitar que un Action se ejecute (por ejemplo si estamos haciendo alguna validación). Sirven
para ejecutar algún proceso particular que se quiere aplicar a un conjunto de Actions. De hecho
muchas de las características con que cuenta Struts 2 son proporcionadas por los interceptores.
Uso de Interceptors.
• Cada interceptor proporciona una característica distinta al Action. Para sacar la mayor
ventaja posible de los interceptores, un Action permite que se aplique más de un
interceptor.
• Para lograr esto Struts 2 permite crear pilas o stacks de interceptores y aplicarlas a los
Actions. Cada interceptor es aplicado en el orden en el que aparece en el stack.
• También podemos formar pilas de interceptores en base a otras pilas. Una de estas pilas
de interceptores es aplicada por default a todos los Actions de la aplicación (aunque si
queremos también podemos aplicar una pila particular a un Action).
Uso de Interceptors.
• La siguiente tabla muestra algunos
de los interceptores más importantes
que ya vienen incluidos en Struts 2.

• Para mayor información se pueden


referir a:
• https://
struts.apache.org/core-developers/int
erceptors.html
Crear un interceptor para verificar la
sesión
• Para verificar que un usuario esté firmado en la aplicación, vamos a agregar un
interceptor que valide si el usuario existe en la sesión y hacer la funcionalidad común a
todos los action. Bueno, queremos que casi todos los Actions de la aplicación estén
protegidos.
• Si, casi todos, debemos dejar al menos un Action sin proteger (público): el Action para
el login de la aplicación. Claro, podemos dejar públicos tantos Actions como queramos,
pero necesitamos al menos un punto de entrada a la aplicación para que el usuario pueda
loguearse.
• Si el usuario intenta ejecutar un Action que esté protegido, y aún no se ha logueado,
podemos enviarlo a una página de error o directamente al formulario de logueo.
Nosotros haremos esto último.
Crear un interceptor para verificar la
sesión
• Primero, hay que crear nuestro nuevo interceptor. Para ello vamos a crear una clase
llamada InterceptorAcceso en el paquete com.interceptors que extienda la superclase
AbstractInterceptor.
Crear un interceptor para verificar la
sesión
• Por ahora sólo usaremos el método "intercept", en el cual verificaremos que exista la
propiedad llamada "usuario" en la sesión, la cual se estableció en el LoginAction.
• Si no encuentra este objeto en la sesión, entonces supondremos que el usuario aún no se
ha logueado y lo enviaremos al formulario de ingreso al sistema:

@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>

<interceptor name="loginInterceptor" class="com.interceptors.InterceptorAcceso"></interceptor>

</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.

También podría gustarte