2011-12-28 10 views
22

Ho scritto un filtro che deve essere richiamato ogni volta che si accede a un URL sul mio sito TRANNE i file CSS, JS e IMAGE. Quindi nella mia definizione mi piacerebbe avere qualcosa del tipo:In un modello di corrispondenza url-pattern web.xml esiste un modo per escludere gli URL?

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

C'è comunque da fare questo? L'unica documentazione che posso trovare ha solo/*

UPDATE:

ho finito per usare qualcosa di simile ad una risposta fornita da 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

Possibile duplicato di [Posso escludere alcuni URL concreti da all'interno di ?] (Http://stackoverflow.com/questions/3125296/can-i-exclude-some-concrete-urls-from- url-pattern-inside-filter-mapping) –

risposta

21

penso che si può provare questo uno: mappatura modello

@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

da dove viene @WebFilter? Attualmente sto usando spring-mvc e sto definendo il mio filtro usando @Service (value = "myAuthorizationFilter") – kasdega

+0

Penso che questa sia una normale annotazione JavaEE. Controlla [qui] (http://docs.oracle.com/javaee/6/api/javax/servlet/annotation/WebFilter.html) –

+0

Ho finito per fare qualcosa di molto simile a questo, ma ho usato regex con Pattern and Matcher . Come questo: 'Modello statico privato excludeUrls = Pattern.compile (" ^. */(Css | js | images | ckeditor) /.*$ ", Pattern.CASE_INSENSITIVE);' – kasdega

5

L'URL non supporta le esclusioni. Questa è una limitazione delle specifiche Servlet. Puoi provare la soluzione alternativa postata da Mr.J4mes.

1

Probabilmente si potrebbe dichiarare un altro filtro "in bianco" per css, js ecc, e metterlo prima di altri filtrano mappatura.

0

Ho utilizzato il vincolo di sicurezza per accedere al controllo. Vedere il codice:

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

seguo this tutorial.

Problemi correlati