2010-08-12 23 views
6

¿Hay alguna manera de hacer que una asignación de filtro no incluya subdirectorios?Asignación de filtro url-pattern que excluye subdirectorios

Por ejemplo.

Tengo archivos .xhtml en mi raíz de contexto, y también tengo una subcarpeta denominada "prueba" con los archivos con la misma extensión. ¿Hay alguna posibilidad de asignar un filtro a los archivos en el contexto raíz y no a los archivos en el directorio "prueba"?

Respuesta

17

El url-pattern es, en efecto restrictivo en juego. Solo permite matchnig exacto, prefijo o sufijo. No está en medio/general/coincidencia de expresiones regulares. Por ejemplo, /*.xhtml lo que pretendes hacer no va a funcionar.

Si desea excluir XHTML en la carpeta /test solamente, entonces su mejor es realmente un Filter escucha en un url-pattern de *.xhtml lo que hace básicamente lo siguiente puesto de trabajo en doFilter() método:

// First cast ServletRequest to HttpServletRequest. 
HttpServletRequest hsr = (HttpServletRequest) request; 

// Check if requested resource is not in /test folder. 
if (!hsr.getServletPath().startsWith("/test/")) { 
    // Not in /test folder. Do your thing here. 
} 

Los HttpServletRequest#getServletPath() básicamente rendimientos la parte del URI de solicitud desde la ruta de contexto activada.

De ser necesario, puede configurar el valor /test como <init-param> del filtro para que pueda controlar el valor desde el interior del web.xml en lugar de en el código del filtro.

+1

Primero pensé que estaba codificado en Filter? pero el init-param es inteligente. He aprendido algo aquí. – JoseK

+0

@Jose: de nada. – BalusC

-1

Algunos contenedores (como la resina) definen una extensión para filtrar la definición de mapeo en web.xml que permite especificar url-regexp que permite emparejar las URL en función de la expresión regular. (reference). Vea si su contenedor tiene algo como esto.

0

Usando lo que está disponible para los servlets/filtros estándar, no hay una forma directa de excluir el subdirectorio, ya que las asignaciones de estilo *.ext incluyen subdirectorios. Podría solucionar esto al declarar otro filtro que maneje específicamente el mapeo /test/*.xhtml y lo maneje en consecuencia.

+0

Pero un filtro con el mapeo/* sería todavía incluyen todo bajo/prueba ¿no? –

+0

Eso es correcto. Estaba pensando que el primero coincidente es el usado, pero ese no es el caso. En su lugar, podría agregar una verificación de expresiones regulares de URL en su filtro: si coincide con la expresión regular, el filtro realiza su trabajo antes de delegar en la cadena de filtro de reinicio. Si la expresión regular no coincide, simplemente delega en la cadena de filtros sin realizar ningún trabajo. – mdma

3

La solución, básicamente lo que necesita su propia clase de filtro y definir con exclusión de URL como init-param para el filtro

package test; 

import java.io.IOException; 
import java.util.ArrayList; 
import java.util.List; 

import javax.servlet.Filter; 
import javax.servlet.FilterChain; 
import javax.servlet.FilterConfig; 
import javax.servlet.ServletException; 
import javax.servlet.ServletRequest; 
import javax.servlet.ServletResponse; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 

public class LoginValidationFilter implements Filter { 

    private String loginPage = ""; 
    private List<String> excludedURLs; 

    public void init(FilterConfig filterConfig) throws ServletException { 
     this.loginPage = filterConfig.getInitParameter("loginPage"); 

     String[] excluded = filterConfig.getInitParameter("excludedURLs").split(";"); 
     excludedURLs = new ArrayList<String>(); 
     for (int i = 0; i < excluded.length; i++) { 
      excludedURLs.add(excluded[i]); 
     } 
    } 

    public void destroy() { 
     this.loginPage = ""; 
    } 

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, 
      ServletException { 

     HttpServletRequest httpRequest = request instanceof HttpServletRequest ? (HttpServletRequest) request : null; 
     HttpServletResponse httpResponse = response instanceof HttpServletResponse ? (HttpServletResponse) response 
       : null; 

     if (httpRequest == null || httpResponse == null) { 
      filterChain.doFilter(request, response); 
      return; 
     } 

     boolean isExcludedURL = false; 
     for (int i = 0; i < excludedURLs.size(); i++) { 
      if (httpRequest.getRequestURL().indexOf(excludedURLs.get(i)) > -1) { 
       isExcludedURL = true; 
       break; 
      } 
     } 

     if (isExcludedURL) { 
      filterChain.doFilter(request, response); 
     } else { 
      if (UserUtil.validateUserLogin(httpRequest)) { 
       filterChain.doFilter(request, response); 
      } else { 
       httpResponse.sendRedirect(httpRequest.getContextPath() + loginPage); 
      } 
     } 
    } 
} 

y definir el filtro, mapeo y excluir direcciones URL en web.xml

<filter> 
    <filter-name>LoginValidationFilter</filter-name> 
    <filter-class>test.LoginValidationFilter</filter-class> 
    <init-param> 
     <param-name>loginPage</param-name> 
     <param-value>/login.jsp</param-value> 
    </init-param> 
    <init-param> 
     <param-name>excludedURLs</param-name> 
     <param-value>/admin/;/assets/;/content/;/css/;/js/;/login.jsp;/login.cmd;/logout.cmd;forgot_password.jsp;pageName=</param-value> 
    </init-param> 
</filter> 
<filter-mapping> 
    <filter-name>LoginValidationFilter</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping> 
+0

Disculpe, esta es mi primera publicación, me llevó unos 30 minutos corregir el formato. La solución, básicamente, necesitas tu propia clase de filtro y definir las URL excluyentes como init-param para filtro. – softskin

0

Puede agregar un valor de correlación url para cada archivo que tenga en la raíz de contexto, por lo tanto, el filtro se aplicará a esos archivos pero ninguno a los archivos en la carpeta de prueba (en realidad, solo se aplicará a esos archivos específicos). Los siguientes trabajó para mí

<url-pattern>/index.faces</url-pattern> 
Cuestiones relacionadas