2010-07-15 25 views
21

¿Cuál es la diferencia, en realidad, entre los filtros y los interceptores? Me doy cuenta de que los interceptores disparan antes y después de una acción, recursivamente, y los filtros se pueden configurar para disparar acciones y en ciertos patrones de URL. ¿Pero cómo sabes cuándo usar cada uno?Filtros vs Interceptores en Struts 2

En el libro que estoy leyendo en Struts 2, parece que los interceptores están siendo empujados e incluso seguí un tutorial para escribir un Interceptor de autenticación para asegurarme de que el usuario está conectado. Sin embargo, si el usuario intenta acceder una URL que no tiene una acción asociada, el interceptor no la detecta, lo que significa que tendré que asociar una acción con cada jsp que quiero que sea segura. Eso no parece correcto.

Puedo hacer un filtro de autenticación que maneje direcciones URL para que no tenga que hacer eso, pero entonces, ¿cuál es el punto de los interceptores?

+10

Es una buena práctica colocar su .jsp en la carpeta/WEB-INF. De esta forma, no se pueden solicitar directamente por URL. Más bien, el usuario debería pasar por Acciones, que luego reenvía a la jsp correcta (según el resultado). – Pat

Respuesta

4

la pila del interceptor se dispara en cada solicitud.
filtros solo se aplican a las direcciones URL para las que están definidos.

editar - utiliza uno u otro dependiendo de la necesidad. Supongamos que necesita verificar que haya una cookie presente para cada solicitud. Usuario un interceptor. Digamos que necesita abrir una aplicación externa en algunas solicitudes (impulsada por una url), use un filtro.

creo interceptores son la herramienta que se utiliza con mayor frecuencia ...

¿por qué usted tiene una URL asociada con ninguna acción?

+0

La pila del interceptor se activa solo para las solicitudes definidas en el paquete para el cual esa pila es la pila predeterminada, también puedo tener acciones definidas en otros paquetes que el interceptor no activará para un filtro, puede ser selectivo . Un filtro también puede aplicarse a todas las URL. Para verificar si una cookie está presente, no veo por qué no usarías también un filtro para eso. Si tiene un jsp simple, como un formulario de carga de imágenes, por ejemplo, puede que no haya ningún trabajo para el que necesite una acción. ¿Debo hacer clases de acción para cada jsp? Incluso si están vacíos? – JPC

+0

no tiene razón, si no tiene sentido una acción, entonces no la inserte. Aunque por lo que recuerdo, una acción puede enrutar a una jsp simplemente devuelve un valor de cadena. Creo que encontrará que hay muchas maneras de hacer las cosas, por lo que el hecho de que exista cierta superposición es natural. – hvgotcodes

+0

Supongo que solo estoy buscando la mejor práctica y no he podido encontrar ninguna respuesta. Especialmente con el complemento de convención ahora, si tengo un formulario de carga, puedo acceder a él como una acción escribiendo "/ upload-form". Ni siquiera tengo que acceder al jsp directamente. El problema es que esto no activa un interceptor, por lo que un filtro es lo único que captará esto. – JPC

42

La diferencia más significativa es que los "interceptores" son una parte del marco Struts 2, y son solo parte del manejo de solicitudes que realiza el marco Struts 2. "Filtros" por otro lado son una parte de la especificación del servlet; en otras palabras, son parte de la API de Servlet. Si está utilizando Struts 2, debe usar interceptores para envolver la funcionalidad de sus acciones de Struts 2. Si está tratando de ajustar la funcionalidad a las solicitudes que llegan a su aplicación web, pero Struts 2 no las maneja, un filtro podría ser más apropiado.

Por cierto, todo el marco Struts 2 se despliega dentro de un filtro configurado en su aplicación web, declarados en el descriptor de despliegue de la aplicación web (web.xml) como:

<filter> 
     <filter-name>struts2</filter-name> 
     <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> 
    </filter> 

    <filter-mapping> 
     <filter-name>struts2</filter-name> 
     <url-pattern>/*</url-pattern> 
    </filter-mapping> 

Este filtro, que está configurado para atrapar todos los patrones de solicitud de URL, es el punto de entrada en todo el marco de Struts 2.

Espero que ayude.

+0

gracias por la sugerencia sobre la diferenciación del marco de Servlet Spec y Struts 2. – asgs

+0

eso significa que tienen la misma funcionalidad. – hiway

+2

@hiway No diría que tienen la misma funcionalidad, diría que cumplen el mismo rol funcional en dos contextos muy diferentes. – chad

4

¿Qué es Interceptor?

El marco Struts 2 utiliza el concepto de interceptores para compartir la solución de algunas inquietudes comunes mediante diferentes acciones.

Como sabemos, el marco invoca un objeto de acción particular en la submisión de una solicitud para ello. Pero antes de ejecutar Action, la invocación es interceptada por otro objeto para proporcionar el procesamiento adicional requerido.

De forma similar después de la ejecución de Acción, la invocación puede ser interceptada nuevamente. Este objeto de interceptación se conoce como Interceptor.

Por lo tanto, el uso del Interceptor es para permitir un mayor control sobre la capa del controlador y separar algunas lógicas comunes que se aplican a múltiples acciones.

La estructura Struts 2 ya ha proporcionado su propio conjunto de interceptores que se pueden utilizar en la aplicación para proporcionar el procesamiento requerido antes y después de la ejecución de las clases de acción.

Uno de ellos es "Alias ​​Interceptor" que voy a tratar aquí.

Alias ​​Interceptor:

Alias ​​Interceptor se utiliza en caso de acción de encadenamiento. Encadenamiento de acción significa que una Acción llama a otra Acción después de la ejecución exitosa de la primera acción.

Este interceptor alias un parámetro con nombre a un nombre de parámetro diferente. En el encadenamiento de acción, cuando dos clases de acción diferentes comparten un parámetro común con un nombre diferente, este Interceptor se utiliza para dar un nombre de alias a un parmetro de la primera clase de acción, que coincide con el nombre del parámetro en la segunda clase de acción.

El alias de expresión de la acción debe estar en la forma de:

   #{ 'name1' : 'alias1' , 'name2' : 'alias2' } 
3

Como por el puntales 2 ciclo de vida/arquitectura no hay interceptores se ejecutan antes del filtro. Entonces, si no hay un mapeo de acción para su solicitud, se está produciendo un error al pasar por el filtro.

0

Struts 2 Framework no depende de Servlet API. Struts 2 Las acciones no están acopladas a un contenedor. En la mayoría de los casos, los contextos de los servlets se representan como mapas simples, lo que permite probar las acciones de forma aislada.

El filtro forma parte de Servlet API, por lo que Struts 2 Framework utiliza el concepto de interceptores para compartir la solución de algunas inquietudes comunes mediante diferentes acciones.

También puede escribir fácilmente casos de prueba para Interceptor y clase de acción.

0

Como regla general

  • Los filtros se ejecutan antes que cada request. El struts en sí es un filtro.
  • interceptors se puede ejecutar antes, después de acciones de struts. No se ejecutarán si la solicitud no finaliza con .action.

Así, algunos ejemplos de filtros podría ser:

  • Si desea comprimir sus js y css archivos, usted debe ir para los filtros no interceptores.
  • Si solo desea que cierta dirección IP acceda a su sitio web, debe desarrollarlo como filtro y verificar la dirección IP de la solicitud.
  • Si desea proteger su sitio contra ataques CSRF, debe escribir un filtro para verificar el token CSRF en las solicitudes.
  • Si desea registrar su respuesta sitio por tiempo de solicitud, puede utilizar un filtro para calcular el tiempo antes y después de chain.doFilter(request, response)

Teóricamente se puede desarrollar una aplicación puntales web sin el desarrollo de su propia interceptors y el uso de filters solamente. Pero enfrentará muchos problemas y codificará los filtros de la caldera.

Muchos de los puntales 2 características están construidos con interceptores, puedes encontrarlo en struts-default.xml (https://struts.apache.org/docs/struts-defaultxml.html) la lista te ayudará a encontrar cuándo se pueden usar los interceptores. (Por ejemplo ParametersInterceptor corre antes acciones para aplicar los valores del formulario inscritos por acciones)

Durante el trabajo con los interceptores se puede acceder fácilmente puntales características, por ejemplo getText de recursos de mensajes, obtener el nombre de la acción actual y el espacio de nombres, cambiar la acción fluir.

Teniendo en cuenta por encima de aquí son algunos casos que se pueden desarrollar por los interceptores:

  • Si desea que sólo los usuarios registrados pueden acceder a ciertas acciones, debe desarrollar con los interceptores.
  • Si desea realizar un seguimiento de las acciones del usuario es la navegación. Puede usar un interceptor para realizar un seguimiento de las acciones visitadas.
  • Si desea manejar sus errores de acción en un solo punto, se puede utilizar un interceptor que capturan todos los invocation.invoke()

Los interceptores están proporcionando el filtro y la cadena de patrón de diseño responsabilidad de las acciones puntales, mientras que los filtros proporcione este patrón a toda su aplicación web.

Cuestiones relacionadas