2010-09-17 12 views

Respuesta

9

Puede establecer un atributo en su solicitud y marcarlo en su segundo 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); 
     } 
     //... 
    } 
} 

Se puede simplificar el código anterior como esto:

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

De esta manera usted solo comprueba la presencia del atributo "executeSecondFilter"

+1

Buena idea, pero este ejemplo arrojará NPE si el atributo no está establecido. – BalusC

+1

@BalusC, es por eso que puse '! = True', pero el auto-unboxing ganó la Comparación de objetos, ahora está corregido :) –

+1

También podría usar' Boolean.TRUE'. Sin embargo, personalmente me parece feo;) – BalusC

47

Además de la respuesta de Colin, hay De otra manera: simplemente no llame al FilterChain#doFilter(), sino al RequestDispatcher#forward().

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

Pero esto evitará todos los filtros de actual sobre, esperar de los que están escuchando en <dispatcher>FORWARD</dispatcher>.

+1

Buena solución. Pero, pensamos que haríamos el atributo, porque es un poco más simple. –

+6

De nada. Sin embargo, esta sería la única solución cuando el código fuente del otro filtro esté completamente fuera de su control (de terceros, etc.). – BalusC

+8

El ejemplo anterior olvida la parte de la URL después de la ruta del servlet base. Esto solucionará eso: request.getRequestDispatcher ((((HttpServletRequest) request) .getServletPath() + StringUtils.defaultString (((HttpServletRequest) solicitud) .getPathInfo())) .forward (solicitud, respuesta); – Cojones

Cuestiones relacionadas