2010-09-17 16 views

cevap

9

İsteğinize bir Öznitelik belirleyebilir ve ikinci filtrenizde kontrol edebilirsiniz.

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

Böyle Yukarıdaki kodu kolaylaştırabilirsiniz:

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

Bu şekilde sadece özelliğin varlığını kontrol "executeSecondFilter"

Colin'in cevap ilaveten
+1

Güzel bir fikir, ancak öznitelik belirlenmemişse bu örnek NPE'yi atar. – BalusC

+1

@BalusC, Bu yüzden bir '! = True' koydum, ancak otomatik olarak kutsanan nesne karşılaştırması kazandı, şimdi düzeltildi :) –

+1

Ayrıca 'Boolean.TRUE' özelliğini de kullanabilirsiniz. Ancak, ben şahsen düz çirkin buluyorum;) – BalusC

47

, orada başka bir yol: sadece FilterChain#doFilter(), ancak RequestDispatcher#forward()'u arama.

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

Ama bu, mevcut dan tüm filtreleri atlamak <dispatcher>FORWARD</dispatcher> dinleyen olanlardan bekleyecektir.

+1

İyi bir çözüm. Ancak, öznitelik yolunu yapacağımızı düşündük, çünkü onun biraz daha basit. –

+6

Rica ederim. Ancak bu, diğer filtrenin kaynak kodunun tamamen kontrolünüz dışında kaldığı tek çözüm olacaktır (3. taraf vb.). – BalusC

+8

Yukarıdaki örnek, temel sunucu yolu yolundan sonra URL'nin bölümünü unutmaktadır. Bu düzeltecektir: request.getRequestDispatcher (((HttpServletRequest) isteği) .getServletPath() + StringUtils.defaultString (((HttpServletRequest) isteği) .getPathInfo()) .forward (istek, yanıt); – Cojones

İlgili konular