Как определяется последовательность вызова фильтров Grails - PullRequest
11 голосов
/ 10 августа 2010

Я использую фильтры для обработки аутентификации и некоторых других проверок предварительных условий для приложения Grails. Я столкнулся с ситуацией, когда было бы неплохо убедиться, что фильтр A всегда вызывается до фильтра B.

Согласно документации " фильтры выполняются в порядке, в котором они определены ", но неясно, к чему относится это определение. Я знаком с тем, как это работает для Java EE ServletFilters, где последовательность объявляется в порядке соответствующих тегов в web.xml, но поскольку развертывание выполняется автоматически в Grails, я не совсем уверен, где я мог повлиять на порядок в котором настроены фильтры.

Возможно ли это вообще в Grails, и если да, то как?

Обновление

Если в одном классе объявлено несколько фильтров, очевидно, что они будут выполнены в том порядке, в котором они были объявлены. Меня больше интересуют фильтры, определенные в разных классах, и последовательность, в которой эти классы будут рассматриваться.

Ответы [ 3 ]

7 голосов
/ 10 августа 2010

Molske правильно, что они выполняются в порядке, определенном в классе. Единственным исключением является то, что первый фильтр «до», который возвращает ложные значения, останавливает обработку.

Существует также новый параметр конфигурации 'зависящий от', который можно использовать для упорядочения различных классов фильтров, т. Е. Что MyFilters2 выполняется после MyFilters1. См. «6.6.4 Зависимости фильтра» в http://grails.org/doc/latest/

3 голосов
/ 17 января 2012
class MyFilters{
def dependsOn=[OtherFilters]
    def filters= {
        doSomething(uri:"/*"){
        //logic
        }
    }
}

В другом фильтре вы можете написать

class OtherFilters{
    def filters={
        doAnotherThing(uri:"/*"){
            before={
            //do other thing
            }
        }
    }
}
0 голосов
/ 10 августа 2010
class MyFilters {
  def filters = {
    myFilter2(controller:'*', action:'*') {}
    myFilter1(controller:'*', action:'*') {}
  }
}

В приведенном выше примере сначала будет выполняться myFilter2, после чего будет выполняться myFilter1.

Порядок, в котором фильтры определены в классе фильтров, порядок, в котором они выполняются.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...