2011-07-03 28 views
141

Nếu chúng ta định nghĩa các bộ lọc servlet cụ thể của webapp trong riêng web.xml của WAR, thì thứ tự thực hiện bộ lọc sẽ giống như thứ tự mà chúng được định nghĩa trong web.xml .Cách xác định thứ tự bộ lọc servlet của việc thực thi bằng cách sử dụng chú thích trong WAR

Nhưng, nếu chúng tôi xác định các bộ lọc đó bằng cách sử dụng chú thích @WebFilter, thứ tự thực hiện bộ lọc là gì và làm cách nào chúng tôi có thể xác định thứ tự thực thi?

Trả lời

153

Bạn thực sự không thể xác định thứ tự thực hiện bộ lọc bằng cách sử dụng chú thích @WebFilter. Tuy nhiên, để giảm thiểu việc sử dụng web.xml, bạn chỉ cần chú thích tất cả các bộ lọc chỉ với một filterName để bạn không cần định nghĩa <filter>, nhưng chỉ cần định nghĩa <filter-mapping> theo thứ tự mong muốn.

Ví dụ,

@WebFilter(filterName="filter1") 
public class Filter1 implements Filter {} 

@WebFilter(filterName="filter2") 
public class Filter2 implements Filter {} 

với trong web.xml chỉ này:

<filter-mapping> 
    <filter-name>filter1</filter-name> 
    <url-pattern>/url1/*</url-pattern> 
</filter-mapping> 
<filter-mapping> 
    <filter-name>filter2</filter-name> 
    <url-pattern>/url2/*</url-pattern> 
</filter-mapping> 

Nếu bạn muốn giữ các mẫu URL trong @WebFilter, sau đó bạn có thể chỉ cần làm như vậy,

@WebFilter(filterName="filter1", urlPatterns="/url1/*") 
public class Filter1 implements Filter {} 

@WebFilter(filterName="filter2", urlPatterns="/url2/*") 
public class Filter2 implements Filter {} 

nhưng bạn vẫn nên giữ <url-pattern> trong web.xml, bởi vì nó yêu cầu theo XSD, mặc dù nó có thể để trống:

<filter-mapping> 
    <filter-name>filter1</filter-name> 
    <url-pattern /> 
</filter-mapping> 
<filter-mapping> 
    <filter-name>filter2</filter-name> 
    <url-pattern /> 
</filter-mapping> 

Bất kể phương pháp này, tất cả điều này sẽ thất bại trong Tomcat cho đến khi phiên bản 7.0.28 vì nó cuộn cảm trên mặt của <filter-mapping> mà không <filter>. Xem thêm Using Tomcat, @WebFilter doesn't work with <filter-mapping> inside web.xml

+3

họ có thể đã giới thiệu thuộc tính 'order' của chú thích' @ WebFilterMapping' lồng nhau. Tôi tự hỏi liệu không làm điều đó cho sự đơn giản – Bozho

+6

@ Bozho: Điều đó sẽ không đủ cụ thể. Điều gì xảy ra nếu webapp của bạn đi kèm với thư viện của bên thứ ba có bộ lọc? Thật khó để nói trước mệnh lệnh của nó. – BalusC

+0

hm, vâng. đã đồng ý. – Bozho

7

Đặc tả Servlet 3.0 dường như không cung cấp gợi ý về cách bộ chứa nên đặt hàng các bộ lọc đã được khai báo thông qua chú thích. Rõ ràng là làm thế nào để đặt hàng các bộ lọc thông qua khai báo của họ trong tệp tin web.xml.

Hãy an toàn. Sử dụng bộ lọc thứ tự tệp web.xml có phụ thuộc lẫn nhau. Cố gắng làm cho bộ lọc của bạn tất cả các đơn đặt hàng độc lập để giảm thiểu nhu cầu sử dụng tệp web.xml.

+3

Tôi có nhiều bộ lọc Servlet trong dự án của mình, trong số đó chỉ có một bộ lọc cụ thể phải được gọi trước và thứ tự của các bộ lọc khác không phải là mối quan tâm. Tôi có phải làm hỏng tất cả các bộ lọc trong web.xml không? Hoặc có bất kỳ vết cắt ngắn nào không? – siva636

-4

Đáng buồn là bạn phải sử dụng một chút XML.

Kiểm tra the spec phần 8.2 và thêm các bit bạn cần vào tệp web.xml hoặc web-fragment.xml, tùy thuộc vào bao bì của bạn. Lưu ý đây là những

Trong một web.xml, bạn có thể lọc và nghe theo tên:

<absolute-ordering> 
    <name>FirstFilter</name> 
    <name>NextFilter</name> 
</absolute-ordering> 

Trong một web-fragment.xml bạn có thể lọc và nghe trước hoặc sau khi những người khác theo quy định của tên hoặc nói chung với thẻ "những người khác". Ví dụ, để cố gắng đặt JAR của bạn đầu tiên, sử dụng sau trong web fragment.xml

<order> 
    <before> 
    <others/> 
    </before> 
</order> 

Lưu ý rằng các đơn đặt hàng web fragment.xml cho JAR, và các bộ lọc hoặc thính giả trong cùng một JAR được tùy ý đặt hàng, trừ khi được chỉ định trong tệp tin web.xml của ứng dụng.

+4

trong đó là con của . Một cách tốt đẹp để làm điều đó, cảm ơn. – Oversteer

+1

Các giải thích khác tại đây: https://blogs.oracle.com/swchan/entry/servlet_3_0_web_fragment –

+0

Nó có hoạt động trong tomcat 7 không? Vì tôi không thấy bất kỳ tài liệu nào cho nó – Dejell