2012-07-25 31 views
57

Estoy usando un filtro de servlet en mi aplicación JSF. Tengo tres grupos de páginas Web en mi solicitud, y yo quiero comprobar la autenticación de estas páginas en mi filtro de servlet:Dando múltiples patrones de URL al filtro de servlet

mis carpetas

/Admin/ *.xhtml 

/Supervisor/*.xhtml 
/Employee/*.xhtml 

y le escribo web.xml como

<filter> 
    <filter-name>LoginFilter</filter-name> 
    <filter-class>com.ems.admin.servlet.LoginFilter</filter-class> 
</filter> 

<filter-mapping> 
    <filter-name>LoginFilter</filter-name> 
    <url-pattern>/Employee/*</url-pattern> 
</filter-mapping> 
<filter-mapping> 
    <filter-name>LoginFilter</filter-name> 
    <url-pattern>/Admin/*</url-pattern> 
</filter-mapping> 
<filter-mapping> 
    <filter-name>LoginFilter</filter-name> 
    <url-pattern>/Supervisor/*</url-pattern> 
</filter-mapping> 

sino como solicitudes

http://localhost:8080/EMS2/faces/Html/Admin/Upload.xhtml 

no están entrando en F ilter.

Tengo que proporcionar seguridad a estas 3 carpetas.

¿Cómo solucionar este problema?

Respuesta

100

Si un patrón de URL comienza con /, entonces es relativo a la raíz de contexto. El patrón de URL /Admin/* solo coincidiría con las páginas en http://localhost:8080/EMS2/Admin/* (suponiendo que /EMS2 es la ruta de contexto), pero las tiene realmente en http://localhost:8080/EMS2/faces/Html/Admin/*, por lo que su patrón de URL nunca coincide.

Necesitas prefijar sus patrones de URL con /faces/Html, así como tan:

<url-pattern>/faces/Html/Admin/*</url-pattern> 

Puede, alternativamente, también acaba de volver a configurar el proyecto web estructura/configuración de modo que usted puede deshacerse de la trayectoria /faces/Html en las direcciones URL para que solo pueda abrir la página, por ejemplo, http://localhost:8080/EMS2/Admin/Upload.xhtml.

Su sintaxis de mapeo de filtros está bien. Sin embargo, una manera más simple para especificar varios patrones de URL es usar simplemente un solo <filter-mapping> con múltiples <url-pattern> entradas:

<filter-mapping> 
    <filter-name>LoginFilter</filter-name> 
    <url-pattern>/faces/Html/Employee/*</url-pattern> 
    <url-pattern>/faces/Html/Admin/*</url-pattern> 
    <url-pattern>/faces/Html/Supervisor/*</url-pattern> 
</filter-mapping> 
+4

por lo que yo puedo ver varios elementos url-pattern no están permitidos y no funcionan como se esperaba. –

+14

@SebastianG: Su problema concreto es causado en otra parte. Tenga en cuenta que el soporte para múltiples elementos '' se introdujo en Servlet 2.5 (parte de Java EE 5, lanzado hace casi 7 años). Tal vez estés trabajando en una bestia prehistórica, o tienes graves problemas de configuración que hacen que tu contenedor se ejecute en un modo de reserva que coincida con el Servlet 2.4 o anterior, perdiendo así todas las funciones de Servlet 2.5. – BalusC

+14

Observe que múltiples '' ejecutarán el mismo filtro dos veces si coinciden con el mismo recurso, por ejemplo, usando '/ *' y otro usando '/ foo.xhtml' como' url-pattern'. Encontré este comportamiento en JBoss AS 7.1. – Paranaix

11

En caso de que esté utilizando el método de anotación para la definición de servlet (en contraposición a definirlos en el web.xml) , puede hacerlo con solo colocar una serie de asignaciones de servlets en el @WebServlet anotación:

/** 
* Servlet implementation class LoginFilter 
*/ 
@WebServlet({"/faces/Html/Employee", "/faces/Html/Admin", "/faces/Html/Supervisor"}) 
public class LoginFilter extends HttpServlet { 
    ... 
+7

¿No es mejor extender un 'Filtro' en lugar de' HttpServlet' aunque solo sea un ejemplo ? – alexander

+0

Se puede ejecutar un filtro para diferentes patrones de servlet URL.No puede reemplazar un filtro con un servlet. –

+0

Quiere un comportamiento de filtro, no uno de servlet. Supongo que ya ha mapeado esas URL a servlets. –

Cuestiones relacionadas