INTERCEPTORSCURSO STRUTS 2 En el siguiente apartado del curso se estudiará el componente...

17
INTERCEPTORS CURSO STRUTS 2 En 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

Transcript of INTERCEPTORSCURSO STRUTS 2 En el siguiente apartado del curso se estudiará el componente...

Page 1: INTERCEPTORSCURSO STRUTS 2 En el siguiente apartado del curso se estudiará el componente Interceptor del framework Struts 2, realizando una descripción.

INTERCEPTORSCURSO STRUTS 2

En 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

Page 2: INTERCEPTORSCURSO STRUTS 2 En el siguiente apartado del curso se estudiará el componente Interceptor del framework Struts 2, realizando una descripción.

INTERCEPTORSCURSO STRUTS 2

¿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

modelD

rive

params

workflow

Page 3: INTERCEPTORSCURSO STRUTS 2 En el siguiente apartado del curso se estudiará el componente Interceptor del framework Struts 2, realizando una descripción.

INTERCEPTORSCURSO STRUTS 2

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:

1.Fase de pre-procesamiento

2.Devolución control ActionInvocation

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

Page 4: INTERCEPTORSCURSO STRUTS 2 En el siguiente apartado del curso se estudiará el componente Interceptor del framework Struts 2, realizando una descripción.

INTERCEPTORSCURSO STRUTS 2

FUNCIONAMIENTO DE LOS INTERCEPTORS

Orden de invocación de los InterceptorsEl 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<interceptor-stack name="basicStack">

<interceptor-ref name="exception"/><interceptor-ref name="servletConfig"/><interceptor-ref name="prepare"/><interceptor-ref name="checkbox"/><interceptor-ref name="params"/><interceptor-ref name="conversionError"/>

</interceptor-stack>

El orden de ejecución de los Interceptors del basicStack sería: primero exception, segundo servletConfig, tercero prepare, cuarto checkbox, quinto params y, sexto conversionError. La clase ActionInvocation sigue el mismo orden de ejecución de los Interceptors que según están declarados en la configuración.

Page 5: INTERCEPTORSCURSO STRUTS 2 En el siguiente apartado del curso se estudiará el componente Interceptor del framework Struts 2, realizando una descripción.

struts.xml

<package>

INTERCEPTORSCURSO STRUTS 2

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:

Packageconfigurando 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.<package name=”...” namespace=”...” extens=”struts-default”>

<interceptor-ref name="roles"/><interceptor-ref name="basicStack"/>

<action name="..." class="...">

<result>/jsp/Success.jsp</result></action>

</package>

Actionconsiste en configurar el Interceptor Stack a ejecutarse para un solo <action> de la configuración del package, el resto de URL que estén en el package no ejecutarán los Interceptors.<package name=”...” namespace=”...” extens=”struts-default”>

<action name="..." class="..."><interceptor-ref name="roles"/><interceptor-ref name="basicStack"/><result>/jsp/Success.jsp</result>

</action></package>

<package>

configuración interceptor

<action>

configuración interceptor

Page 6: INTERCEPTORSCURSO STRUTS 2 En el siguiente apartado del curso se estudiará el componente Interceptor del framework Struts 2, realizando una descripción.

INTERCEPTORSCURSO STRUTS 2

CONFIGURACIÓN DE LOS INTERCEPTORS

defaultStackStruts 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<package name="struts-default" abstract="true">

<interceptors>...

<interceptor-stack name="defaultStack"> <interceptor-ref name="exception"/> <interceptor-ref name="alias"/> <interceptor-ref name="servletConfig"/> <interceptor-ref name="i18n"/> <interceptor-ref name="prepare"/> <interceptor-ref name="chain"/> <interceptor-ref name="debugging"/> <interceptor-ref name="profiling"/> <interceptor-ref name="scopedModelDriven"/> <interceptor-ref name="modelDriven"/> <interceptor-ref name="fileUpload"/> <interceptor-ref name="checkbox"/> <interceptor-ref name="staticParams"/> <interceptor-ref name="actionMappingParams"/> <interceptor-ref name="params">

<param name="excludeParams">dojo\..*,^struts\..*</param> </interceptor-ref> <interceptor-ref name="conversionError"/> <interceptor-ref name="validation">

<param name="excludeMethods">input,back,cancel,browse</param> </interceptor-ref> <interceptor-ref name="workflow">

<param name="excludeMethods">input,back,cancel,browse</param> </interceptor-ref>

</interceptor-stack>

...

</interceptors>

<default-interceptor-ref name="defaultStack"/> </package>

Page 7: INTERCEPTORSCURSO STRUTS 2 En el siguiente apartado del curso se estudiará el componente Interceptor del framework Struts 2, realizando una descripción.

INTERCEPTORSCURSO STRUTS 2

CONFIGURACIÓN DE LOS INTERCEPTORS

Sobrescribir configuración InterceptorsSe puede sobrescribir la configuración de los Interceptor de dos métodos:

STACK COMPLETO

REFERENCIAR A UN INTERCEPTOR STACK

Definir el Stack completo de Interceptors<package name=”...” namespace=”...” extends=”struts-default”>

<action name="..." class="..."><interceptor-ref name="exception"/><interceptor-ref name="alias"/><interceptor-ref name="params"/><interceptor-ref name="servletConfig"/><interceptor-ref name="prepare"/><interceptor-ref name="i18n"/><interceptor-ref name="chain"/><interceptor-ref name="modelDriven"/><interceptor-ref name="fileUpload"/><interceptor-ref name="staticParams"/><interceptor-ref name="params"/><interceptor-ref name="conversionError"/><interceptor-ref name="validation">

<param name="excludeMethods">myValidationExcudeMethod</param>

</interceptor-ref><interceptor-ref name="workflow">

<param name="excludeMethods">myWorkflowExcludeMethod</param>

</interceptor-ref></action>

</package>

Referenciar al Interceptor Stack ya configurada y modificar al configuración.<package name=”...” namespace=”...” extends=”struts-default”>

<action name="..." class="..."><interceptor-ref name="defaultStack">

<param name="validation.excludeMethods">myValidationExcludeMethod</param><param name="workflow.excludeMethods">myWorkflowExcludeMethod</param>

</interceptor-ref></action>

</package>

Page 8: INTERCEPTORSCURSO STRUTS 2 En el siguiente apartado del curso se estudiará el componente Interceptor del framework Struts 2, realizando una descripción.

INTERCEPTORSCURSO STRUTS 2

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 (<action>).

•Interceptors Utilidad

•Interceptors Transferencia Datos

•Interceptors Workflow

•Interceptors Seguridad

•Interceptors Varios

Page 9: INTERCEPTORSCURSO STRUTS 2 En el siguiente apartado del curso se estudiará el componente Interceptor del framework Struts 2, realizando una descripción.

INTERCEPTORSCURSO STRUTS 2

INTERCEPTORS POR DEFECTO

Interceptors UtilidadEl cometido de los siguientes Interceptors dados por el framework, es realizar labores que faciliten el desarrollo, rendimiento y encuentren problemas.

TIMER DEBUG LOGGER PROFILING

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

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/loginINFO: Finishing execution stack for action /capitulo2/loginPuede ser útil para depuración (debug) de las peticiones.

PROFILINGPermite 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).

DEBUGEl 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:

xmlconsolecommandbrowser

Page 10: INTERCEPTORSCURSO STRUTS 2 En el siguiente apartado del curso se estudiará el componente Interceptor del framework Struts 2, realizando una descripción.

INTERCEPTORSCURSO STRUTS 2

INTERCEPTORS POR DEFECTO

Interceptors Transferencia DatosLos Interceptors que se basan en transferencia de datos gestionan y manipulan los datos de diferentes formas: parámetros dinámicos, parámetros estáticos, conversión tipos, checkbox…

PARAMS STATIC-PARAMS AUTOWIRING SERVLET-CONFIG

FILEUPLOAD ALIAS CHECKBOX

PARAMSEl objeto de este Interceptor es transferir los parámetros recibidos de una petición al Value Stack.

STATIC-PARAMSEste 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.<action name="..." class=". . .">

<param name=”atributo1”>valor atributo 1</param>

<param name=”atributo2”>valor atributo 2</param></action>

SERVLET-CONFIGEl Interceptor servlet-config permite inyectar varios objetos del API Java Servlet en el Action, a través de métodos “setter” que son definidos en los interfaces que debe implementar el Action. La lista de interfaces, que debe implementar el Action, y objeto que asigna mediante su método “set” es la siguiente:

•ServletContextAware – para el ServletContext.•ServletRequestAware – para el HttpServletRequest.•ServletResponseAware – para el HttpServletResponse.•ParameterAware – asigna un Map con los parámetros de la petición (request).•RequestAware – asigna un Map con los atributos de la petición (request).•SessionAware – asigna un Map con los atributos de la sesión.•ApplicationAware – asigna un Map con los atributos del ServletContext.•PrincipalAware – asigna el objeto de seguridad Principal.

FILEUPLOADInterceptor que gestión el envío de archivos a la aplicación, controlando el tipo mime, tamaño máximo y las extensiones de archivo soportadas.

ALIASInterceptor que modifica el nombre de distintos parámetros que puedan ser coincidir en una petición, o bien, obligar mediante la configuración “aliasses”, a que el nombre de ciertos parámetros pase a llamarse de otro forma.

CHECKBOXInterceptor responsable de gestionar los valores de los checkbox en los formulario, tanto para aquellos que estén seleccionados (checked), como los que no, en cuyo caso marca el valor “false” o “null” según sea el atributo.El problema de los checkbox procede del propio tipo de elemento Web que se trata, el cual no envía ninguna información en la petición en el momento que no está seleccionado (checked).

Page 11: INTERCEPTORSCURSO STRUTS 2 En el siguiente apartado del curso se estudiará el componente Interceptor del framework Struts 2, realizando una descripción.

INTERCEPTORSCURSO STRUTS 2

INTERCEPTORS POR DEFECTO

Interceptors WorkflowLa 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

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

<interceptor-ref name="workflow"><param name="excludeMethods">input,back,cancel,browse, errorValidacion</param><param name="inputResultName">errorValidacion</param>

</interceptor-ref>

VALIDATIONEl Interceptor validation, es el responsable de las validaciones que debe realiza el framework de validaciones que usa el framework Struts 2. No realiza las mismas validaciones que el Interceptor workflow.

PREPAREEl Interceptor prepare dispone de un punto de entrada en el Action para invocar al método “prepare()” el cual realiza tareas de pre-procesamiento antes de que se ejecute la lógica del Action “execute()”. Para que entre en ejecución este Interceptor el Action de implementar el interface Preparable, el cual define el método “prepare()”. El interceptor dispone de un parámetro para su configuración, allwaysInvokePrepare (Boolean) para indicar si se debe o no llamar al método “prepare()”, por defecto es true.Este Interceptor resulta útil para aquellos Actions en las que es necesario un fase preprocesamiento antes de realizar la lógica, como puede ser invocar a la fuente de datos para obtener un listado de objetos o un objeto que es necesario en el método “execute()”.

MODELDRIVENEl interceptor modelDriven, 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. Para que entre en acción esta tarea, la clase Action de implementar el interface ModelDriven y método “getModel()” donde se retorna el objeto del Action que hay que completar con los parámetros.

Page 12: INTERCEPTORSCURSO STRUTS 2 En el siguiente apartado del curso se estudiará el componente Interceptor del framework Struts 2, realizando una descripción.

INTERCEPTORSCURSO STRUTS 2

INTERCEPTORS POR DEFECTO

Interceptors SeguridadStruts 2 también proporciona algunos Interceptors relacionados con la seguridad de las aplicaciones en su entorno, el Contenedor de Servlets.

ROLES

Page 13: INTERCEPTORSCURSO STRUTS 2 En el siguiente apartado del curso se estudiará el componente Interceptor del framework Struts 2, realizando una descripción.

INTERCEPTORSCURSO STRUTS 2

INTERCEPTORS POR DEFECTO

Interceptors VariosEl 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

EXECANDWAITEste Interceptor se utiliza para aquellos Actions cuya ejecución de su lógica tarde mucho tiempo en completarse. El objetivo del Interceptor es mostrar una pantalla intermedia al usuario donde se muestre el progreso de la evolución de la petición original, informando al usuario en todo momento del estado de su petición.

Page 14: INTERCEPTORSCURSO STRUTS 2 En el siguiente apartado del curso se estudiará el componente Interceptor del framework Struts 2, realizando una descripción.

INTERCEPTORSCURSO STRUTS 2

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 Interceptorpublic 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 AbstractInterceptorStruts 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.

class Diagrama Clase...

«interface»Interceptor

AbstractInterceptor

Page 15: INTERCEPTORSCURSO STRUTS 2 En el siguiente apartado del curso se estudiará el componente Interceptor del framework Struts 2, realizando una descripción.

INTERCEPTORSCURSO STRUTS 2

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

Page 16: INTERCEPTORSCURSO STRUTS 2 En el siguiente apartado del curso se estudiará el componente Interceptor del framework Struts 2, realizando una descripción.

INTERCEPTORSCURSO STRUTS 2

RECUERDA QUE…

Durante el siguiente apartado hemos aprendido qué es y como funciona los componentes Interceptors dentro de la arquitectura del framework Struts 2, resaltando los siguientes conceptos vistos:

Definición Funcionamiento Orden Configuración

Page 17: INTERCEPTORSCURSO STRUTS 2 En el siguiente apartado del curso se estudiará el componente Interceptor del framework Struts 2, realizando una descripción.

INTERCEPTORSCURSO STRUTS 2

RECUERDA QUE…

Es muy importante conocer con que tipos de Interceptors cuenta Struts 2, así como el objetivo de cada uno:

Utilidad

Transferencia Datos

Workflow

Seguridad

Varios