2010-08-09 25 views
11

Tôi đang sử dụng filters để xử lý xác thực và một số kiểm tra trước điều kiện khác cho một ứng dụng Grails. Tôi đã chạy vào một tình huống mà nó sẽ được tốt đẹp để đảm bảo rằng bộ lọc A luôn luôn được gọi trước khi bộ lọc B.Trình tự yêu cầu của các bộ lọc Grails được xác định

Theo tài liệu "bộ lọc được thực hiện theo thứ tự được xác định" nhưng nó là không rõ định nghĩa đó là gì. Tôi quen thuộc với cách hoạt động của Java EE ServletFilters, trong đó trình tự được khai báo theo thứ tự các thẻ tương ứng trong web.xml, nhưng khi triển khai được xử lý tự động trong Grails, tôi không thực sự chắc chắn nơi tôi có thể ảnh hưởng đến thứ tự trong đó các bộ lọc được thiết lập.

Điều đó có thể xảy ra ở Grails hay không và nếu có thì làm cách nào?

Cập nhật

Nếu một vài bộ lọc được khai báo trong một lớp, nó rõ ràng rằng họ sẽ được thực hiện theo thứ tự mà chúng được khai báo. Tôi quan tâm nhiều hơn với các bộ lọc được xác định trong các lớp khác nhau và trình tự mà những lớp học sẽ được xem xét trong.

Trả lời

7

Molske là đúng rằng họ đang thực hiện theo trình tự quy định tại lớp. Một ngoại lệ là bộ lọc 'trước' đầu tiên trả về xử lý dừng sai.

Ngoài ra còn có tùy chọn cấu hình mới 'phụ thuộc' mà bạn có thể sử dụng để đặt hàng các lớp lọc khác nhau, tức là MyFilters2 chạy sau MyFilters1. Xem "6.6.4 Dependencies Lọc" tại http://grails.org/doc/latest/

+0

Cảm ơn, đó là tùy chọn cấu hình mà tôi đang tìm kiếm –

+1

http://www.grails.org/doc/latest/guide/single.html#6.6.4%20Filter%20Dependencies cho liên kết trực tiếp –

+0

+1 trả về sai trước đây {} để ngừng xử lý thêm bộ lọc, chỉ cần những gì tôi đang tìm kiếm ;-) – virtualeyes

0
class MyFilters { 
    def filters = { 
    myFilter2(controller:'*', action:'*') {} 
    myFilter1(controller:'*', action:'*') {} 
    } 
} 

Trong ví dụ trên, myFilter2 sẽ được thực hiện đầu tiên, sau đó, myFilter1 sẽ được thực thi.

Trình tự các bộ lọc được định nghĩa trong các bộ lọc hạng nhất, theo thứ tự chúng được thực hiện trong.

+0

Tôi nghĩ rằng tôi đã không làm cho rằng rõ ràng trong câu hỏi của tôi (tôi sẽ khắc phục điều đó), đó là về các bộ lọc được xác định trong các lớp khác nhau. Rằng các bộ lọc trong một lớp sẽ được thực hiện theo trình tự mà chúng được định nghĩa có ý nghĩa hoàn chỉnh, tất nhiên. –

3
class MyFilters{ 
def dependsOn=[OtherFilters] 
    def filters= { 
     doSomething(uri:"/*"){ 
     //logic 
     } 
    } 
} 

Trong bộ lọc khác mà bạn có thể viết

class OtherFilters{ 
    def filters={ 
     doAnotherThing(uri:"/*"){ 
      before={ 
      //do other thing 
      } 
     } 
    } 
} 
Các vấn đề liên quan