2010-08-09 9 views
11

Sto utilizzando filters per gestire l'autenticazione e alcuni altri controlli di pre-condizione per un'applicazione Grails. Mi sono imbattuto in una situazione in cui sarebbe stato utile assicurarsi che il filtro A venisse sempre richiamato prima del filtro B.Come è definita la sequenza di invocazione dei filtri Grails

Secondo la documentazione i "filtri vengono eseguiti nell'ordine in cui sono definiti" ma è non chiaro a cosa si riferisce questa definizione. Ho familiarità con il funzionamento di Java EE ServletFilters, in cui la sequenza è dichiarata dall'ordine dei tag corrispondenti nel web.xml, ma poiché la distribuzione viene gestita automaticamente in Grails, non sono sicuro di dove poter influenzare l'ordine in cui i filtri sono impostati.

È possibile tutto ciò che c'è in Grails, e se sì, come?

Aggiornamento

Se diversi filtri sono dichiarate all'interno di una classe, è ovvio che essi saranno eseguiti nell'ordine in cui sono state dichiarate. Sono più interessato a filtri definiti in classi diverse e la sequenza che tali classi saranno considerate.

risposta

7

Molske è corretto che stanno eseguiti nell'ordine definito nella classe. Un'eccezione è costituita dal fatto che il primo filtro "prima" restituisce false interruzioni di elaborazione.

C'è anche una nuova opzione di configurazione 'dependsOn' che è possibile utilizzare per ordinare classi di filtro diverse, vale a dire che MyFilters2 viene eseguito dopo MyFilters1. Vedere "6.6.4 Filtro Dipendenze" in http://grails.org/doc/latest/

+0

Grazie, questa è l'opzione di configurazione che stavo cercando –

+1

http://www.grails.org/doc/latest/guide/single.html#6.6.4%20Filter%20Dependencies per un collegamento diretto –

+0

+1 restituendo false in before {} per interrompere ulteriormente l'elaborazione dei filtri, proprio quello che stavo cercando ;-) – virtualeyes

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

Nell'esempio precedente, myFilter2 sarà eseguita prima, dopo che, myFilter1 verrà eseguito.

L'ordine dei filtri sono definiti nel filtri di classe, l'ordine in cui vengono eseguite in.

+0

penso non ho fatto chiaro nella mia interrogazione (Riparerò che), si tratta di filtri definiti in diverse classi. Che i filtri all'interno di una classe vengano eseguiti nella sequenza in cui sono definiti, ovviamente, ha perfettamente senso. –

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

Nella altro filtro è possibile scrivere

class OtherFilters{ 
    def filters={ 
     doAnotherThing(uri:"/*"){ 
      before={ 
      //do other thing 
      } 
     } 
    } 
} 
Problemi correlati