Cách xác định thứ tự thực hiện bộ lọc servlet bằng cách sử dụng các chú thích trong WAR


167

Nếu chúng tôi xác định các bộ lọc servlet dành riêng cho ứng dụng web theo cách riêng của WAR web.xml, thì thứ tự thực hiện của các bộ lọc sẽ giống như thứ tự mà chúng được xác định trong web.xml.

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

Câu trả lời:


187

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 @WebFilterchú thích. Tuy nhiên, để giảm thiểu việc web.xmlsử dụng, nó đủ để chú thích tất cả các bộ lọc chỉ với một filterNameđể bạn không cần <filter>định nghĩa, mà chỉ cần một<filter-mapping> định nghĩa theo thứ tự mong muốn.

Ví dụ,

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

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

chỉ với web.xmlđiều 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ữ mẫu URL @WebFilter, thì bạn có thể 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ể cách tiếp cận nào, tất cả điều này sẽ thất bại trong Tomcat cho đến phiên bản 7.0.28 vì nó bị bóp nghẹt khi <filter-mapping>không có <filter>. Xem thêm Sử dụng Tomcat, @WebFilter không hoạt động với <bộ lọc ánh xạ> bên trong web.xml


5
họ đã có thể giới thiệu một orderthuộc tính của @WebFilterMappingchú thích lồng nhau . Tôi tự hỏi liệu người ta không làm điều đó vì đơn giản
Bozho

12
@Bozho: Điều đó sẽ không đủ cụ thể. Điều gì xảy ra nếu ứng dụng web của bạn có thư viện bên thứ 3 bao gồm bộ lọc? Thật khó để nói trước trật tự của nó.
BalusC

1
@BalusC: Đã xảy ra lỗi trong ví dụ của bạn: mô hình url được đóng bằng tên bộ lọc.
AndrewBourgeois

3
@AndrewBourgeois: Đã sửa. Là một lỗi copypaste. Thật tệ là trình soạn thảo Markdown không có xác thực XML tích hợp như trong Eclipse;)
BalusC

6
Việc sử dụng <url-pattern />không hoạt động trên JBoss EAP 6.1 - nó ghi đè @WebFiltergiá trị và ngăn không cho bộ lọc chạy.
seanf

12

Thông số Servlet 3.0 dường như không cung cấp gợi ý về cách một container nên đặt hàng các bộ lọc đã được khai báo qua các chú thích. Tuy nhiên, rõ ràng về cách đặt hàng các bộ lọc thông qua khai báo của chúng trong tệp web.xml.

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


4
Tôi có nhiều bộ lọc Servlet trong dự án của mình, trong số chúng chỉ có một bộ lọc cụ thể phải được gọi trước và thứ tự các bộ lọc khác không phải là vấn đề đáng lo ngại. Tôi có phải làm ô uế tất cả các bộ lọc trong web.xml không? Hoặc có bất kỳ cắt ngắn?
siva636
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.