2012-03-17 4 views

Respuesta

0

Generalmente utilizamos un filtro cuando queremos filtrar y/o modificar solicitudes en función de condiciones específicas. Para que S2 funcione, necesita realizar ciertos trabajos de reprocesamiento y modificación para poder ejecutar con éxito su solicitud, mientras que en otras manos usamos Servlet cuando queremos controlar, preprocesar y/o postprocesar solicitudes.

Para controlar la solicitud S2 use Servlet debajo del capó pero ocultándolo para que la estructura general de la aplicación sea más limpia y fácil de usar.

Esto es lo que tenemos para los filtros en The Java EE 6 Tutorial.

Un filtro es un objeto que puede transformar el encabezado y el contenido (o ambos) de una solicitud o respuesta. Los filtros difieren de los componentes web en que los filtros generalmente no crean una respuesta. En cambio, un filtro proporciona una funcionalidad que se puede "adjuntar" a cualquier tipo de recurso web. En consecuencia, un filtro no debería tener dependencias en un recurso web para el cual actúa como filtro; de esta manera, se puede componer con más de un tipo de recurso web.

5

Según Struts2 Budi Karnival struts2 libro, Hay una clara ventaja de usar un filtro sobre un servlet como controlador. Con un filtro puede elegir cómodamente servir todos los recursos en su aplicación, incluidos los estáticos.

Con un servlet, su controlador solo maneja el acceso a la parte dinámica de la aplicación. Tenga en cuenta que el elemento url-pattern en el archivo web.xml de la aplicación anterior es

<servlet> 
    <servlet-name>Controller</servlet-name> 
    <servlet-class>...</servlet-class> 
</servlet> 

<servlet-mapping> 
    <servlet-name>Controller</servlet-name> 
    <url-pattern>*.action</url-pattern> 
</servlet-mapping> 

Con tal ajuste, las solicitudes de recursos estáticos no son manejados por el controlador servlet, pero por el contenedor. No querrá manejar recursos estáticos en su controlador de servlet porque eso significaría trabajo adicional.

Un filtro es diferente. Un filtro puede optar por enviar solicitudes de contenido estático. Para transmitir una solicitud, llame al método filterChain.doFilter en el método doFilter del filtro.

En consecuencia, utilizar un filtro como controlador le permite bloquear todas las solicitudes a la aplicación, incluida la solicitud de contenido estático. A continuación, tendrá la siguiente configuración en el descriptor de despliegue:

<filter> 
    <filter-name>filterDispatcher</filter-name> 
    <filter-class>...</filter-class> 
</filter> 
<filter-mapping> 
    <filter-name>filterDispatcher</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping> 

La ventaja de este filtro: Una cosa es segura, puede proteger fácilmente sus archivos estáticos de los ojos curiosos.

El siguiente código enviará un mensaje de error si un usuario intenta ver un archivo JavaScript:

public void doFilter(ServletRequest request, ServletResponse response,FilterChain  filterChain) throws IOException, ServletException { 
    HttpServletRequest req = (HttpServletRequest) request; 
HttpServletResponse res = (HttpServletResponse) response; 
String uri = req.getRequestURI(); 
if (uri.indexOf("/css/") != -1 && req.getHeader("referer") == null) { 
    res.sendError(HttpServletResponse.SC_FORBIDDEN); 
} else { 
    // handle this request 
} 
} 

No va a proteger el código de las personas más decididos, pero el tipo de usuarios ya no pueden en la URL de su archivo estático para verlo. De la misma manera, puede proteger sus imágenes para que nadie pueda vincularlas a su cargo.

Otra ventaja:

La introducción de los interceptores en Struts2 framework.It no sólo reducir nuestro esfuerzo de codificación, pero nos ayuda a escribir cualquier código que se habría utilizado filtros para la codificación y el cambio necesario en la web. xml en lugar de Struts1.Así que ahora cualquier código que se adapte mejor en Filter ahora se puede mover a interceptores (que es más controlable que los filtros), toda la configuración puede controlarse en el archivo struts.xml, sin necesidad de tocar el archivo web.xml

+0

@Punit_Patel Si el 'servlet-mapping' del' ActionServlet' para Struts 1 se estableció en '/' en lugar de '* .action', ¿Struts 1 no capturará entonces todos el contenido estático y actuar de la misma manera que 'FilterDispatcher' de Strut 2? – 8bitjunkie

+0

@ 7SpecialGems Si utiliza/como el mapeo de url para ActionServlet que tiene que escribir código adicional. Por ejemplo, en el caso del archivo CSS, debe escribir el código para leer el archivo CSS y escribir en el objeto de respuesta. Mientras que en el caso de Filter, puede llamar al método filterChain.doFilter en el método doFilter del filtro. –

Cuestiones relacionadas