1 CURSO STRUTS 2 INTERCEPTORSEn el siguiente apartado del curso se estudiará el componente Interceptor del framework Struts 2, realizando una descripción de su objetivo, tareas y características. La información que se estudiará en este apartado es: ¿Qué son los Interceptors? Funcionamiento de los Interceptors Configuración de los Interceptors Interceptors por defecto de Struts 2 Construcción de Interceptors personalizados
2 ¿QUÉ SON LOS INTERCEPTORS?CURSO STRUTS 2 INTERCEPTORS ¿QUÉ SON LOS INTERCEPTORS? Un Interceptor es un componente de Struts 2 que se encarga de capturar las peticiones Web que se reciben antes de llegar al Modelo (Action) para realizar gestiones sobre esta. Cada Interceptor tiene como meta realizar una labor en concreto sobre la petición, de esta forma se mantiene la independencia entre cada Interceptor: interceptor para la gestión de excepciones, interceptor para la validación, interceptor para la conversión de tipos, … Mediante los Interceptors el framework Struts 2 consigue una alto nivel de separación entre las capas de la arquitectura Modelo-Vista-Controlador, dado que trabajan de forma aislada cada petición y no se acoplan con el resto de capas de la arquitectura. Action Result exception modelDrive params workflow
3 FUNCIONAMIENTO DE LOS INTERCEPTORSCURSO STRUTS 2 INTERCEPTORS FUNCIONAMIENTO DE LOS INTERCEPTORS El componente ActionInvocation del framework, es la clase responsable de la ejecución completa de una petición, gestionando el orden de ejecución de los Interceptors, el Action y el Result correspondiente. Cada vez que la clase ActionInvocation llama a un Interceptor ejecuta el método intercept(), donde el Interceptor realiza sus labores, una de las propias tareas del interceptor es volver a llamar al ActionInvocation mediante la sentencia: invocation.invoke() devolviendo el control a la clase ActionInvocation para que valide el estado y, si este es correcto, pase a ejecutar el siguiente Interceptor, y así sucesivamente. Cada Interceptor pasa por tres fases en su ejecución: Fase de pre-procesamiento Devolución control ActionInvocation Fase post-procesamiento Fase de pre-procesamiento, el Interceptor puede realizar tareas de preparación, filtrado, alteración datos o cualquier tarea que manipule los datos antes de que alcancen el Action. Devolución control ActionInvocation, llamando para ello al método invoke(), o devolviendo directamente un resultado String. La clase ActionInvocation será la que decida pasar el control al siguiente Interceptor, o al Action, o al Result, si el estado no es correcto. Fase post-procesamiento, el Interceptor realiza tareas de alteración de los datos, gestión de errores, estado de atributos. Pero durante esta fase no se podrá modificar el estado (Result) dado que está ya se ha procesado.
4 FUNCIONAMIENTO DE LOS INTERCEPTORSCURSO STRUTS 2 INTERCEPTORS FUNCIONAMIENTO DE LOS INTERCEPTORS Orden de invocación de los Interceptors El Interceptor Stack que se deben ejecutar en una petición, se ejecutan en el mismo orden en los que están declarados en la configuración XML. Ejemplo basicStack
5 CONFIGURACIÓN DE LOS INTERCEPTORSCURSO STRUTS 2 INTERCEPTORS CONFIGURACIÓN DE LOS INTERCEPTORS Los Interceptor se deben declarar en los archivos de configuración XML de la aplicación, y básicamente existe dos lugares para configurar el Interceptor Stack a ejecutar en una petición: Package configurando de esta forma el Interceptor Stack estos se ejecutan para todos las URL del package. Se puede configurar mediante la extensión de un paquete que ya tiene definida una configuración de Interceptors, por ejemplo struts-default, o bien realizar la propia configuración de los Interceptor.
6 CONTENIDO PACKAGE STRUTS-DEFAULTCURSO STRUTS 2 INTERCEPTORS CONFIGURACIÓN DE LOS INTERCEPTORS defaultStack Struts 2 dispone de un package con la configuración por defecto para la mayoría de los Actions, el cual se puede extender para reutilizar su configuración. CONTENIDO PACKAGE STRUTS-DEFAULT Al extender de la package struts-default automáticamente el package que lo utilice tendrá configurado el Interceptor Stack, defaultStack, pero esta configuración se puede variar, sobrescribir o incluso definir una totalmente nueva. Contenido del package struts-default
7 CONFIGURACIÓN DE LOS INTERCEPTORSDefinir el Stack completo de Interceptors
8 INTERCEPTORS POR DEFECTOCURSO STRUTS 2 INTERCEPTORS INTERCEPTORS POR DEFECTO Struts 2 viene con toda una serie de Interceptors ya configurados, que realizan la mayoría de las tareas posibles que se presenta en una aplicación Web. De todas formas el framework permite desarrollar tus propios Interceptors y configurar su ejecución para las peticiones. Para utilizar los Interceptors que proporciona el framework lo más sencillo es que la configuración, el package de un extienda de la configuración struts-default donde se encuentran configurados el Interceptors Stack, interceptor-stack, o bien configurar el Interceptor Stack por petición (
9 INTERCEPTORS POR DEFECTOCURSO STRUTS 2 INTERCEPTORS INTERCEPTORS POR DEFECTO Interceptors Utilidad El cometido de los siguientes Interceptors dados por el framework, es realizar labores que faciliten el desarrollo, rendimiento y encuentren problemas. TIMER DEBUG LOGGER PROFILING TIMER Este Interceptor simplemente captura la duración de la ejecución de una petición, enviando esta información mediante la librería commons-loggin. INFO: Executed action [/capitulo2/login] took 50 ms. Puede ser útil para conocer el rendimiento y tiempo de ejecución de los distintos Action. PROFILING Permite realizar tareas de profiling para cada petición, pudiendo activarse mediante un parámetro recibido en la petición HTTP, por defecto profiling=true. El nombre del parámetro para activar este Intercepor se puede configurar mediante el parámetro profilingKey (String). DEBUG El Interceptor permite obtener la información que gestiona la página actual de la aplicación para conocer los datos. Para activar el Interceptor es necesario que el parámetro devMode del framework esté true, permitiendo obtener los valores actuales de la página de cuatro formas distintas: xml console command browser LOGGER Este Interceptor dispone de un mecanismo simple de loggin que registra la fase de pre-procesamiento y la fase de post-procesamiento de una petición. INFO: Starting execution stack for action /capitulo2/login INFO: Finishing execution stack for action /capitulo2/login Puede ser útil para depuración (debug) de las peticiones.
10 INTERCEPTORS POR DEFECTOSTATIC-PARAMS Este Interceptor también transfiere una serie de parámetros al Value Stack, pero en este caso el origen de los valores de estos están definidos en el archivo de configuración XML.
11 INTERCEPTORS POR DEFECTOCURSO STRUTS 2 INTERCEPTORS INTERCEPTORS POR DEFECTO Interceptors Workflow La labor del siguiente grupo de Interceptor, es gestionar el flujo de trabajo de las peticiones y el estado de las mismas, pudiendo llegar incluso a cambiar el Result a mostrar. WORKFLOW VALIDATION PREPARE MODELDRIVEN WORKFLOW Este interceptor se encarga de invocar al método “validate()” del Action, siempre y cuando este implemente el interface Validateable. En el momento que se produce un error en la ejecución de los métodos de validación que definen estos interfaces en el Actio, automáticamente el Interceptor envía el String “INPUT” al framework. public String intercept(ActionInvocation invocation) throws Exception { Action action = invocation.getAction(); if (action instanceof Validateable) { Validateable validateable = (Validateable) action; validateable.validate(); } if (action instanceof ValidationAware) { ValidationAware validationAwareAction = ValidationAware) action; if (validationAwareAction.hasErrors()) { return Action.INPUT; return invocation.invoke(); Este interceptor puede configurarse con varios parámetros: alwaysInvokeValidate (Boolean), indica si se debe invocar siempre el método “valídate()”,por defecto “true”. inputResultName (String), respuesta a enviar al framework, si se produce un error en la validación, por defecto es “INPUT”. excludeMethods (String), métodos para los que no se debe ejecutar la validación, por ejemplo para el caso de tratarse de un error “error” o “input”, no se debería volver a validar.
12 INTERCEPTORS POR DEFECTOCURSO STRUTS 2 INTERCEPTORS INTERCEPTORS POR DEFECTO Interceptors Seguridad Struts 2 también proporciona algunos Interceptors relacionados con la seguridad de las aplicaciones en su entorno, el Contenedor de Servlets. ROLES ROLES Este Interceptor solo permite la ejecución del Action si el usuario supera la seguridad JAAS Role. El parámetro de configuración de este Interceptor para indicar que roles son válidos es: allowedRoles (String), lista de roles permitidos separados por comas.
13 INTERCEPTORS POR DEFECTOCURSO STRUTS 2 INTERCEPTORS INTERCEPTORS POR DEFECTO Interceptors Varios El framework cuenta con una serie de variados Interceptors para distintas tareas, como pueda ser gestión errores, token, i18n,… EXCEPTION TOKEN Y TOKEN-SESSION I18N EXECANDWAIT EXCEPTION Este importante Interceptor es el responsable de la gestión de las excepciones en la aplicación, por este motivo siempre suele ejecutarse el primero y último, para capturar cualquier excepción independientemente del punto que se produzca. El Interceptor devuelve la Vista que este configurado con respecto a la exception producida, además añade dos atributos al Value Stack: exception y exceptionStack.
14 CONSTRUCCIÓN DE INTERCEPTORS PERSONALIZADOSCURSO STRUTS 2 INTERCEPTORS CONSTRUCCIÓN DE INTERCEPTORS PERSONALIZADOS Para desarrollar un Interceptor propio basta con crear una clase Java que implemente el interface com.opensymphony.xworkd2.interceptor.Interceptor. El interface Interceptor public interface Interceptor extends Serializable { void destroy(); void init(); String intercept(ActionInvocation invocation) throws Exception; } El interface Interceptor contiene tres métodos sencillos, los dos primeros init() y destroy() se utilizan para el ciclo de vida del Interceptor, mientras que el método intercept(), representa la lógica del Interceptor; en este método debe devolver en algún momento el control al ActionInvocation mediante la llamada a su método “invoke()”, sino se dejaría de ejecutar la petición. NOTA: Los Interceptor no son thread-safe, sólo se crea una instancia de la clase del Interceptor para toda la aplicación, todas las peticiones comparten el mismo Interceptor. Por esto motivo hay que tener cuidado en su desarrollo. La clase AbstractInterceptor Struts 2 también dispone de una clase abstracta que implemente el interface Interceptor, la clase AbstractInterceptor la cual no realiza ninguna tarea en los métodos init() y destroy(), dejando el método intercept() abstracto para que lo completen las clases que extiendan de ella.
15 CONSTRUCCIÓN DE INTERCEPTORS PERSONALIZADOSAutentificacionInterceptor public class AutentificacionInterceptor implements Interceptor { private String paramUsuario = “usuario”; //métodos get y set de paramUsuario public void init() { } public void destroy() { public String intercept( ActionInvocation actionInvocation ) throws Exception { Map session = actionInvocation.getInvocationContext().getSession(); Usuario usuario = (Usuario) session.get(this.paramUsuario); if (usuario == null) { return Action.LOGIN; return actionInvocation.invoke(); CURSO STRUTS 2 INTERCEPTORS CONSTRUCCIÓN DE INTERCEPTORS PERSONALIZADOS Ejemplo Interceptor Personalizado: AutentificacionInterceptor A continuación se mostrará la construcción de un Interceptor que se utilizará para gestionar la autentificación de los usuarios en una aplicación. Clase AutentificacionInterceptor Configuración Interceptor Configuración Interceptor Configuramos el autentificación interceptor para todos los packages excepto el de /login para que invoque en primer lugar el Interceptor de autentificación.
16 CURSO STRUTS 2 INTERCEPTORS RECUERDA QUE…Configuración de los Intercpetors Los Interceptor se deben declarar en los archivos de configuración XML de la aplicación, y básicamente existe dos lugares para configurar el Interceptor Stack a ejecutar en una petición: Action, configurar el Interceptor Stack a ejecutarse para un solo Action.
17 CURSO STRUTS 2 INTERCEPTORS RECUERDA QUE… Interceptors de UtilidadInterceptors que realizan labores para facilitar el desarrollo, rendimiento y encuentren problemas. DEBUG, Interceptor que permite obtener toda la información del ValueStack de la página actual para conocer los datos. LOGGER , Interceptor dispone de un mecanismo simple de loggin que registra la fase de pre-procesamiento y la fase de post-procesamiento de una petición. PROFILING, Interceptor que permite realizar tareas de profiling para cada petición. TIMER, Interceptor que simplemente captura la duración de la ejecución de una petición CURSO STRUTS 2 INTERCEPTORS Interceptors Workflow Grupo de Interceptor que gestionan el flujo de trabajo de las peticiones y el estado de las mismas, pudiendo llegar incluso a cambiar el Result a mostrar. MODELDRIVEN, Interceptor que utiliza el patrón ModelDriven para instanciar todos los parámetros de la petición en un atributo del Action, ocultando a la Vista que tipo de objeto se trata. PREPARE, Interceptor dispone de un punto de entrada en el Action para invocar al método “prepare()” el cual realiza tareas de pre-procesamiento. VALIDATION, Interceptor responsable de las validaciones que debe realiza el framework de validaciones que utiliza el framework Struts 2. WORKFLOW, Interceptor encargado de invocar al método “validate()” del Action si este implementa el interface Validateable. RECUERDA QUE… Es muy importante conocer con que tipos de Interceptors cuenta Struts 2, así como el objetivo de cada uno: Utilidad Interceptors de Transferencia de Datos Interceptors que facilitan la transferencia de datos gestionan, así como su manipulación. ALIAS, Interceptor que modifica el nombre de distintos parámetros que puedan ser coincidir en una petición. AUTOWIRING, Interceptor permite un punto de integración para usar Spring para gestionar los recursos. CHECKBOX, Interceptor responsable de gestionar los valores de los checkbox en los formulario. FILEUPLOAD, Interceptor que gestiona el upload de archivos. PARAMS, Interceptor que transfiere los parámetros recibidos de una petición al Value Stack. SERVLET-CONFIG, Interceptor permite inyectar objetos del API Java Servlet en el Action. STATIC-PARAMS, Interceptor transfiere los valores estáticos definidos en los archivox XML al Value Stack. Transferencia Datos Workflow Intercpetors de Seguridad Interceptor relacionados con la seguridad de la aplicación en su entorno, el Contenedor de Servlets. ROLES, Interceptor solo permite la ejecución del Action si el usuario supera la seguridad JAAS Role.0 Seguridad Varios Intercpetors Varios Interceptors para distintas tareas, como pueda ser gestión errores, token, i18n,… EXECANDWAIT, Interceptor utilizado para aquellos Actions cuya ejecución de su lógica tarde mucho tiempo en completarse. EXCEPTION, Interceptor responsable de la gestión de las excepciones en la aplicación. I18N, Interceptor que se encarga de guardar el idioma del usuario en su sesión HTTP. TOKEN Y TOKEN-SESSION, Interceptors destinados a evitar el envío de formularios duplicados (doble submit).