Struts2: Redirección a una acción cuya ejecución fue interceptada

En ocasiones puede ser interesante modificar el flujo de la ejecución de las acciones por parte de un interceptor para luego devolver el control a la acción que fue invocada originalmente.

Un caso paradigmático es el de Login: cuando se quiere acceder a una acción cuyo acceso está restringido a los usuarios por una pantalla de login. El esquema general de funcionamiento sería:

  1. Llamada a la acción original, llamémosla BorrarUsuarioAction
  2. Invocación de un Interceptor que captura el flujo de ejecución antes de que llege a la acción. El nombre será: LoginInterceptor.
  3. LoginInterceptor comprueba si existe el usuario en la sesión.
    1. Si existe deja continuar el flujo de ejecución hacia BorrarUsuarioAction y termina la ejecución.
    2. Si no existe, redirige el flujo a una nueva página llamada login.jsp que a su vez llama a la acción LoginAction.java
  4. LoginAction valida el usuario y redirige a una página, que en este caso debería ser la acción BorrarUsuarioAction, recuperando así el flujo original de llamadas.

El problema está en cómo sabe LoginAction que tiene que redirigir, en el caso de que el nombre y clave sean correctos a la acción cuya llamada originó todo.

La solución consiste en que en LoginInterceptor se almacenará a nivel de sesión el nombre de la acción que se invocó originalmente.

Map session = actionInvocation.getInvocationContext().getSession();
if (session.get(LoginAction.CLAVESESION) == null) {    //Comprueba si hay usuario
         String actionName = actionInvocation.getProxy().getNamespace() + "/" + actionInvocation.getInvocationContext().getName();
        if (actionName.startsWith("/")) {
            actionName = actionName.substring(1);   //Elimina el primer carácter, que es la /
        }
	session.put("lastAction", actionName);    //Almacena en la sesión el nombre de la acción</code>
	return "login";    //Devuelve como resultado el literal login, que en struts.xml redirigirá a Login.jsp
}
else {
return actionInvocation.invoke();   //Si hay usuario
}

Ya tenemos almacenado el nombre de la acción original en la sesión. Ahora, en la configuración struts.xml, cuando haya tenido éxito la acción Login en la validación del usuario, deberá redirigir a la acción que está almacenada en la sesión. Para ello se utiliza la redirección de acción y el parámetro para fijar el destino, que se lee de la sesión.


       <action name = "Login" class="actions.LoginAction">
            <result type="redirect-action">
                <param name="actionName">${#session['lastAction']}</param>
            </result>
            <result name = "error">/Login.jsp</result>
        </action>

Anuncios

Responder

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. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s