2010-09-17 34 views
19

Tôi có 2 bộ lọc trong ứng dụng của mình. Dựa trên một số điều kiện, tôi muốn chọn có thực thi bộ lọc thứ hai hay không. Có cách nào để làm việc này không?Cách bỏ qua bộ lọc trong chuỗi bộ lọc trong java

Tôi đã làm một số việc googling không thành công. Tôi muốn yêu cầu tiếp tục mà không thực hiện bộ lọc thứ hai. Điều đó có thể không?

Mọi trợ giúp sẽ được đánh giá cao.

Trả lời

9

Bạn có thể đặt Thuộc tính trong yêu cầu của mình và kiểm tra trong bộ lọc thứ hai.

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ạn có thể đơn giản hóa các mã trên như thế này:

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

Bằng cách này bạn chỉ cần kiểm tra sự hiện diện của các thuộc tính "executeSecondFilter"

+1

Ý tưởng hay, nhưng ví dụ này sẽ ném NPE nếu thuộc tính không được đặt. – BalusC

+1

@BalusC, Đó là lý do tại sao tôi đặt một '! = True', nhưng tự động unboxing thắng so sánh đối tượng, bây giờ nó được sửa chữa :) –

+1

Bạn cũng có thể sử dụng' Boolean.TRUE'. Tuy nhiên, cá nhân tôi thấy nó khá xấu xí;) – BalusC

47

Ngoài câu trả lời của Colin, có một cách khác: chỉ cần không gọi FilterChain#doFilter(), nhưng RequestDispatcher#forward().

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

Nhưng điều này sẽ bỏ qua tất cả lọc từ hiện hành về, mong đợi của những người được lắng nghe trên <dispatcher>FORWARD</dispatcher>.

+1

Giải pháp tốt. Nhưng, chúng tôi nghĩ rằng chúng tôi sẽ làm theo cách thuộc tính, cos của nó chút đơn giản hơn. –

+6

Bạn được chào đón. Tuy nhiên, điều này sẽ là giải pháp duy nhất khi mã nguồn của bộ lọc khác hoàn toàn nằm ngoài tầm kiểm soát của bạn (bên thứ ba và vân vân). – BalusC

+8

Ví dụ trên quên phần của URL sau đường dẫn servlet cơ bản. Điều này sẽ khắc phục điều đó: request.getRequestDispatcher (((HttpServletRequest) request) .getServletPath() + StringUtils.defaultString (((HttpServletRequest) request) .getPathInfo())) .forward (request, response); – Cojones