2010-09-17 6 views
19

Ich habe 2 Filter in meiner Anwendung. Basierend auf einer Bedingung möchte ich auswählen, ob der zweite Filter ausgeführt werden soll oder nicht. Gibt es eine Möglichkeit, dies zu tun?Wie überspringe ich einen Filter in der Filterkette in Java

Ich habe etwas Googeln mit keinem Erfolg. Ich möchte, dass die Anfrage fortgesetzt wird, ohne den zweiten Filter auszuführen. Ist das möglich?

Jede Hilfe wird geschätzt.

Antwort

9

Sie können in Ihrer Anfrage ein Attribut setzen und es in Ihrem zweiten Filter überprüfen.

public class FirstFilter implements Filter { 
    //... 

    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { 
     servletRequest.setAttribute("executeSecondFilter", true); 
     //... 
     if(someReason) 
      servletRequest.setAttribute("executeSecondFilter", false); 
     filterChain.doFilter(servletRequest, servletResponse); 
    } 
} 

public class SecondFilter implements Filter { 
    //.. 

    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { 
     if (servletRequest.getAttribute("executeSecondFilter") == null || !((Boolean) servletRequest.getAttribute("executeSecondFilter"))) { 
      filterChain.doFilter(servletRequest, servletResponse); 
     } 
     //... 
    } 
} 

können Sie den Code oben wie folgt vereinfachen:

public class FirstFilter implements Filter { 
    //... 

    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { 
     //... 
     if(someReason) 
      servletRequest.setAttribute("executeSecondFilter", false); 
     filterChain.doFilter(servletRequest, servletResponse); 
    } 
} 

public class SecondFilter implements Filter { 
    //.. 

    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { 
     if (servletRequest.getAttribute("executeSecondFilter") != null) { 
      filterChain.doFilter(servletRequest, servletResponse); 
     } 
     //... 
    } 
} 

diese Weise können Sie überprüfen nur das Vorhandensein des Attributs "executeSecondFilter"

+1

Schöne Idee, aber dieses Beispiel wird NPE werfen, wenn das Attribut nicht festgelegt ist. – BalusC

+1

@BalusC, Deshalb habe ich ein '! = True' gesetzt, aber das automatische Auspacken hat den Objektvergleich gewonnen, jetzt ist es behoben :) –

+1

Sie könnten auch' Boolean.TRUE' verwenden. Ich persönlich finde es jedoch einfach hässlich;) – BalusC

47

Neben Colin Antwort, gibt es Ein anderer Weg: Rufen Sie nicht FilterChain#doFilter(), aber RequestDispatcher#forward().

if (condition) { 
    request.getRequestDispatcher(((HttpServletRequest) request).getServletPath()).forward(request, response); 
} else { 
    chain.doFilter(request, response); 
} 

Aber das wird alle Filter von Strom auf, erwartet von denen, überspringt, die auf <dispatcher>FORWARD</dispatcher> hören.

+1

Gute Lösung. Aber wir dachten, wir würden den Attribut-Weg machen, weil es ein bisschen einfacher ist. –

+6

Gern geschehen. Dies wäre jedoch die einzige Lösung, wenn der Quellcode des anderen Filters komplett außer Kontrolle wäre (3rd Party usw.). – BalusC

+8

Das obige Beispiel vergisst den Teil der URL nach dem Basis-Servlet-Pfad. Das behebt das: request.getRequestDispatcher (((HttpServletRequest) Anfrage) .getServletPath() + StringUtils.defaultString ((((HttpServletRequest) Anfrage) .getPathInfo())) .forward (Anfrage, Antwort); – Cojones

Verwandte Themen