2010-08-09 7 views
11

Ich benutze filters, um die Authentifizierung und einige andere Vorbedingungsprüfungen für eine Grails-Anwendung zu behandeln. Ich bin in eine Situation gerannt, in der es nett wäre sicherzustellen, dass Filter A immer vor Filter B aufgerufen wird.Wie ist die Aufrufsequenz der Grails-Filter definiert?

Gemäß der Dokumentation werden die "Filter in der Reihenfolge ausgeführt, in der sie definiert sind" aber es ist unklar, worauf sich diese Definition bezieht. Ich weiß, wie das bei Java EE ServletFiltern funktioniert, bei denen die Reihenfolge in der Reihenfolge der entsprechenden Tags in der web.xml deklariert wird, aber da die Bereitstellung in Grails automatisch erfolgt, weiß ich nicht genau, wo ich die Reihenfolge beeinflussen könnte in dem die Filter eingerichtet sind.

Ist das überhaupt möglich in Grails, und wenn ja, wie?

aktualisieren

Wenn mehrere Filter innerhalb einer Klasse deklariert werden, ist es offensichtlich, dass sie in der Reihenfolge ausgeführt werden, werden feststellen, dass sie deklariert wurden. Ich bin mehr mit Filter in verschiedenen Klassen definiert und die Sequenz, die diese Klassen werden in Betracht gezogen werden.

Antwort

7

Molske ist ausgeführt, dass sie in der Reihenfolge, in der Klasse definiert ausgeführt sind. Eine Ausnahme besteht darin, dass der erste "Vorher" -Filter, der den Fehler zurückgibt, die Verarbeitung stoppt.

Es gibt auch eine neue Konfigurationsoption 'dependsOn', mit der Sie verschiedene Filterklassen bestellen können, d. H. Dass MyFilters2 nach MyFilters1 läuft. Siehe „6.6.4 Filter Abhängigkeiten“ auf http://grails.org/doc/latest/

+0

Danke, das ist die Konfigurationsoption, die ich gesucht habe –

+1

http://www.grails.org/doc/latest/guide/single.html#6.6.4%20Filter%20Dependencies für eine direkte Verbindung –

+0

+1 zurück in vor vorher {} um weitere Filterverarbeitung zu stoppen, genau das, was ich gesucht habe ;-) – virtualeyes

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

In dem obigen Beispiel wird myFilter2 zuerst ausgeführt werden, danach wird myFilter1 ausgeführt werden.

Die Reihenfolge der Filter in der Filter-Klasse definiert sind, werden die Reihenfolge, wie sie in.

richtig
+0

schreiben kann, ich glaube, ich nicht so klar in meiner Frage gemacht hat (Ich werde das in Ordnung bringen), Es geht um Filter, die in verschiedenen Klassen definiert sind. Dass die Filter innerhalb einer Klasse in der Reihenfolge ausgeführt werden, in der sie definiert sind, macht natürlich Sinn. –

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

In den anderen Filter Sie

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