2010-09-17 13 views

risposta

9

È possibile impostare un attributo nella richiesta e verificarlo nel secondo filtro.

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); 
     } 
     //... 
    } 
} 

È possibile semplificare il codice precedente come questo:

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); 
     } 
     //... 
    } 
} 

In questo modo basta controllare la presenza dell'attributo "executeSecondFilter"

+1

Bella idea, ma questo esempio genererà NPE se l'attributo non è impostato. – BalusC

+1

@BalusC, Ecco perché ho messo un '! = True', ma l'auto-unboxing ha vinto il confronto degli oggetti, ora è corretto :) –

+1

Puoi anche usare' Boolean.TRUE'. Tuttavia, personalmente lo trovo brutto;) – BalusC

47

Oltre alla risposta di Colin, non c'è in un altro modo: basta non chiamare FilterChain#doFilter(), ma RequestDispatcher#forward().

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

Ma questo salterà tutti filtri da corrente, si aspettano di quelli che sono in ascolto su <dispatcher>FORWARD</dispatcher>.

+1

Buona soluzione. Ma, pensavamo di fare l'attributo in modo molto semplice. –

+6

Prego. Questo sarebbe comunque l'unica soluzione quando il codice sorgente dell'altro filtro è completamente fuori dal tuo controllo (terze parti e così via). – BalusC

+8

L'esempio precedente dimentica la parte dell'URL dopo il percorso del servlet di base. Ciò risolverà ciò: request.getRequestDispatcher ((richiesta (HttpServletRequest)) .getServletPath() + StringUtils.defaultString ((richiesta (HttpServletRequest)) .getPathInfo())) .forward (richiesta, risposta); – Cojones

Problemi correlati