Фильтры Grails: есть ли способ создания фильтров? - PullRequest
0 голосов
/ 01 сентября 2010

Есть ли способ связать несколько фильтров в приложении Grails (как в фильтрах Java)?Может быть, что-то с пружиной?

Я написал пару фильтров и хотел бы, чтобы они выполнялись последовательно (порядок не особенно важен).Причина этого?Мне нужно написать около 20, 30 фильтров, и я не хочу, чтобы они все были в одном файле.

Я читал о DelegatingFilterProxy в Spring, но не могу понять, какнастройте его так, чтобы он связывал все мои фильтры Grails.

Ответы [ 3 ]

4 голосов
/ 03 сентября 2010

Начиная с Grails 1.3.1, вы можете объединять фильтры в цепочку с помощью ключевого слова depenOn:

def dependsOn = [MyOtherFilters.class]

http://jira.codehaus.org/browse/GRAILS-6229

2 голосов
/ 01 сентября 2010

Возможно, я не понимаю основную проблему здесь, но простой ответ может быть «они уже прикованы». Фильтры выполняются на основе селектора, который вы указали в закрытии фильтра (например, myPreProcessorFilter (controller: '', action: '') {}). Все селекторы, которые соответствуют вашему контроллеру / действию, будут выполнены. Я делаю это все время с фильтрами регистрации и измерения производительности.

Вот пример. Фильтры logAction и measureMethodTime будут применяться ко всем контроллерам и действиям (поскольку я оставил широко открытый селектор).

    import org.springframework.web.context.request.RequestContextHolder as RCH
import com.x.y.*

class PerformanceFilters {
    def filters = {

        logAction(controller:'*', action:'*'){
            before = {
                log.debug("${controllerName}.${actionName}: entering; params=${params}")
            }
        }

        measureMethodTime(controller:'*', action:'*'){
            before = {
                def session = RCH.currentRequestAttributes().getSession(false)
                if (session)
                {
                    Q.startTimer("${session.id}-${controllerName}-${actionName}", "method.${controllerName}.${actionName}")
                }
            }

            afterView = {
                def session = RCH.currentRequestAttributes().getSession(false)
                if (session)
                {
                    Q.stopTimer("${session.id}-${controllerName}-${actionName}", "method.${controllerName}.${actionName}")
                }
            }
        }

    }
}
2 голосов
/ 01 сентября 2010
...