2011-10-29 27 views
8

Giả sử tôi đã sau trong web.xml của tôiThứ tự bộ lọc sẽ được gọi là gì?

<filter-mapping> 
    <filter-name>F1</filter-name> 
    <url-pattern>/XYZ/*</url-pattern> 
</filter-mapping> 
<filter-mapping> 
    <filter-name>F2</filter-name> 
    <url-pattern>/XYZ/abc.do</url-pattern> 
</filter-mapping> 
<filter-mapping> 
    <filter-name>F3</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping> 

Điều gì sẽ là thứ tự mà các bộ lọc sẽ được gọi nếu một yêu cầu được đưa ra khi /XYZ/abc.do.And tại sao?

Trả lời

12

Trong thứ tự ánh xạ của họ được định nghĩa trong web.xml

Nếu sử dụng chú thích (@WebFilter) thứ tự seems to be undefined - bạn vẫn phải khai báo <filter-mapping> mục trong web.xml.

+0

sao cho F1, F2, F3? Nếu trong trường hợp của servlet thì sao? cho phép nói rằng tôi có 1 mô hình phù hợp với 2 servlets? –

+1

nó không quan trọng bao nhiêu servlet/uris nó phù hợp. Tài nguyên đích hiện tại chỉ là một, và cho nó, các bộ lọc được gọi theo thứ tự khai báo ánh xạ. (Vì vậy, có - F1, F2, F3) – Bozho

+0

vâng tôi đã nhận nó.But bây giờ tôi đang yêu cầu abt một scenerio riêng biệt hoàn toàn, nơi cùng một trận đấu patter url để 2 servlet s1 khác nhau và s2.Which servlet sẽ được gọi là? bộ lọc –

14

Mục 6.2.4 của Servlet specification 3.0:

Khi xử lý một yếu tố <filter-mapping> sử dụng <url-pattern> phong cách, container phải xác định xem <url-pattern> phù hợp với yêu cầu URI bằng cách sử dụng quy tắc ánh xạ đường quy định tại Chương 12, “ Yêu cầu ánh xạ tới Servlets ”.

Trình tự container sử dụng trong việc xây dựng chuỗi các bộ lọc để được áp dụng cho một yêu cầu đặc biệt URI được như sau:

  1. Thứ nhất, <url-pattern> ánh xạ bộ lọc tương ứng trong thứ tự mà những yếu tố này xuất hiện trong bộ mô tả triển khai.

  2. Tiếp theo, <servlet-name> ánh xạ bộ lọc phù hợp theo thứ tự mà các thành phần này xuất hiện trong bộ mô tả triển khai.

Nếu một ánh xạ lọc chứa cả <servlet-name><url-pattern>, container phải mở rộng bản đồ lọc thành nhiều ánh xạ lọc (một cho mỗi <servlet-name><url-pattern>), giữ gìn trật tự của các yếu tố <servlet-name><url-pattern>.

Tóm lại: chúng được áp dụng theo thứ tự xuất hiện trong tệp XML. Sẽ rất thú vị nếu bạn nhấn vào một URL được bao phủ bởi cả bộ lọc giới hạn <url-pattern><servlet-name>, vì sau đó tất cả các bộ lọc liên kết mẫu URL được áp dụng trước tất cả các bộ lọc liên kết tên servlet. Tôi đã không bao giờ được trong tình trạng này (chưa thấy bất kỳ bộ lọc bị ràng buộc tên servlet ở tất cả), nhưng tôi nghĩ nó có thể khá khó hiểu.

Các vấn đề liên quan