2011-12-28 14 views
22

Escribí un filtro que debe invocarse cada vez que se accede a una url en mi sitio EXCEPTO los archivos CSS, JS e IMAGE. Entonces, en mi definición me gustaría tener algo como:En un corrector de url-pattern web.xml, ¿hay alguna forma de excluir URL?

<filter-mapping> 
    <filter-name>myAuthorizationFilter</filter-name> 
    <url-pattern>NOT /css && NOT /js && NOT /images</url-pattern> 
</filter-mapping> 

¿Hay alguna forma de hacerlo? La única documentación que puedo encontrar sólo tiene/*

ACTUALIZACIÓN:

Terminé usando algo similar a una respuesta proporcionada por Mr.J4mes:

private static Pattern excludeUrls = Pattern.compile("^.*/(css|js|images)/.*$", Pattern.CASE_INSENSITIVE); 
    private boolean isWorthyRequest(HttpServletRequest request) { 
     String url = request.getRequestURI().toString(); 
     Matcher m = excludeUrls.matcher(url); 

     return (!m.matches()); 
    } 
+1

Posible duplicado de [¿Puedo excluir algunas URL concretas de dentro de ?] (Http://stackoverflow.com/questions/3125296/can-i-exclude-some-concrete-urls-from- url-pattern-inside-filter-mapping) –

Respuesta

21

Creo que se puede probar este uno:

@WebFilter(filterName = "myFilter", urlPatterns = {"*.xhtml"}) 
public class MyFilter implements Filter { 

    @Override 
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) 
      throws IOException, ServletException { 
     String path = ((HttpServletRequest) request).getServletPath(); 

     if (excludeFromFilter(path)) chain.doFilter(request, response); 
     else // do something 
    } 

    private boolean excludeFromFilter(String path) { 
     if (path.startsWith("/javax.faces.resource")) return true; // add more page to exclude here 
     else return false; 
    } 
} 
+0

¿Dónde está @WebFilter? Actualmente estoy usando spring-mvc y estoy definiendo mi filtro usando @Service (value = "myAuthorizationFilter") – kasdega

+0

Creo que esta es una anotación JavaEE normal. Mira [aquí] (http://docs.oracle.com/javaee/6/api/javax/servlet/annotation/WebFilter.html) –

+0

Terminé haciendo algo muy similar a esto, pero utilicé expresiones regulares con Pattern y Matcher . Me gusta: 'static static Pattern excludeUrls = Pattern.compile (" ^. */(Css | js | images | ckeditor) /.*$ ", Pattern.CASE_INSENSITIVE);' – kasdega

5

La asignación de patrones de URL no admite exclusiones. Esta es una limitación de la especificación de Servlet. Puede probar la solución manual publicada por Mr.J4mes.

1

Probablemente podría declarar otro filtro "en blanco" para css, js etc., y colocarlo antes de la asignación de otros filtros.

0

Utilicé la restricción de seguridad para acceder al control. Ver el código:

<security-constraint> 
    <web-resource-collection> 
     <web-resource-name>Unsecured resources</web-resource-name> 
     <url-pattern>/resources/*</url-pattern> 
     <url-pattern>/javax.faces.resource/*</url-pattern> 
    </web-resource-collection> 
</security-constraint> 

Yo sigo this tutorial.

Cuestiones relacionadas