Usando el filtro Servlet en todas las páginas excepto el índice
Frecuentes
Visto 4,874 veces
1
Estoy tratando de usar un Filter
para obligar a mis usuarios a iniciar sesión si quieren acceder a algunas páginas.
Así que mi Filter
tiene que redirigirlos a una página de error en la que no hay sesión.
Pero no quiero que esto suceda cuando visiten index.html
, porque pueden iniciar sesión en la página de índice.
Así que necesito un patrón de URL que coincida con todas las páginas excepto /
y index.xhtml
.
¿Cómo puedo hacer eso? ¿Puedo usar expresiones regulares en mi web.xml
?
EDIT:
Despues de leer este
Pensé que puedo hacer algo como:
if (!req.getRequestURI().matches("((!?index)(.*)\\.xhtml)|((.*)\\.(png|gif|jpg|css|js(\\.xhtml)?))"))
en mi doFilter()
método, pero todavía procesa todo.
Estoy seguro de que la expresión regular funciona porque la probé en línea y coincide con los archivos que no necesitan filtrarse, ¡pero el contenido de if se ejecuta incluso para los archivos excluidos!
EDITAR 2:
Estoy intentando una nueva forma.
He asignado el filtro a *.xhtml
en mi web.xml
, por lo que no necesito excluir css, imágenes y javascript con la expresión regular anterior.
Aquí está el nuevo código (en el doFilter()
)
if (req.getRequestURI().contains("index")) {
chain.doFilter(request, response);
} else {
if (!userManager.isLogged()) {
request.getRequestDispatcher("error.xhtml").forward(request, response);
} else {
chain.doFilter(request, response);
}
}
pero todavía no lo hace porque llama al chain.doFilter()
(en el si exterior) en cada página.
¿Cómo puedo excluir mi página de índice de ser filtrada?
1 Respuestas
5
La web.xml
El patrón de URL no admite expresiones regulares. Solo admite coincidencias de prefijo (carpeta) y sufijo (extensión) comodín como /faces/*
y *.xhtml
.
En cuanto a su problema concreto, aparentemente tiene el archivo de índice definido como un <welcome-file>
y lo están abriendo por /
. De esta manera el request.getRequestURI()
será igual a /contextpath/
no, /contextpath/index.xhtml
. Depurar el request.getRequestURI()
para saber qué recuperó realmente el filtro.
Sugiero una reescritura:
String path = request.getRequestURI().substring(request.getContextPath().length());
if (userManager.isLogged() || path.equals("/") || path.equals("/index.xhtml") || path.startsWith(ResourceHandler.RESOURCE_IDENTIFIER)) {
chain.doFilter(request, response);
} else {
request.getRequestDispatcher("/WEB-INF/error.xhtml").forward(request, response);
}
Mapear este filtro en /*
. Tenga en cuenta que incluí el ResourceHandler.RESOURCE_IDENTIFIER
comprobar para que los recursos JSF como <h:outputStylesheet>
, <h:outputScript>
y <h:graphicImage>
también se omitirá; de lo contrario, terminará con una página de índice sin CSS/JS/imágenes cuando el usuario no haya iniciado sesión.
Tenga en cuenta que asumo que el FacesServlet
está mapeado en un patrón de URL de *.xhtml
. De lo contrario, debe modificar el /index.xhtml
comprobar en path
en consecuencia.
contestado el 22 de mayo de 12 a las 22:05
No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas regex servlets servlet-filters regex-negation or haz tu propia pregunta.
Tienes razón, mi página de índice está configurada como archivo de bienvenida, pero
request.getRequestURI()
huellas dactilares/contextpath/index.xhtml
, por eso esto me parece extraño. Probaré tu solución lo antes posible, ¡gracias! - pasoTNT