servlet example dofilter annotation servlets servlet-filters url-pattern

servlets - example - javax.servlet.filter jar



Dando mĂșltiples patrones de URL al filtro de servlet (2)

En caso de que esté utilizando el método de anotación para la definición del filtro (en lugar de definirlos en el web.xml ), puede hacerlo simplemente colocando una matriz de asignaciones en la anotación @WebFilter :

/** * Filter implementation class LoginFilter */ @WebFilter(urlPatterns = { "/faces/Html/Employee","/faces/Html/Admin", "/faces/Html/Supervisor"}) public class LoginFilter implements Filter { ...

Y solo como un FYI, esto mismo funciona para los servlets que usan la anotación de servlet también:

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

Estoy usando un filtro de servlet en mi aplicación JSF. Tengo tres grupos de páginas web en mi aplicación, y quiero verificar la Autenticación de estas páginas en mi Servlet Filter:

mis carpetas

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

y estoy escribiendo 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>

pero solicitudes como

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

no entran en el filtro

Tengo que proporcionar seguridad a estas 3 carpetas.

Cómo resolver este problema ?


Si un patrón de URL comienza con / , entonces es relativo a la raíz de contexto. El patrón /Admin/* URL 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.

Debes ponerle un prefijo a tus patrones de URL con /faces/Html , así:

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

También puede, como alternativa, reconfigurar la estructura / configuración de su proyecto web para que pueda deshacerse de la ruta /faces/Html en las URL para poder 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 de especificar múltiples patrones de URL es simplemente usar solo un <filter-mapping> con múltiples entradas de <url-pattern> :

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