Usando el filtro Servlet en todas las páginas excepto el índice

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?

preguntado el 22 de mayo de 12 a las 20:05

1 Respuestas

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

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

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.