Подтвердить что ты не робот

Как определяется последовательность вызовов фильтров Grails

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

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

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

Обновление

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

4b9b3361

Ответ 1

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

Также имеется новая опция "dependOn", которую вы можете использовать для заказа различных классов фильтров, то есть MyFilters2 работает после MyFilters1. См. "6.6.4 Зависимости фильтров" в http://grails.org/doc/latest/

Ответ 2

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

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

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

Ответ 3

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

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

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