Grails过滤器:链接过滤器的任何方式?

时间:2010-09-01 18:03:16

标签: spring grails servlet-filters

有没有办法在grails应用程序中链接多个过滤器(如在Java过滤器中)?也许有春天的东西?

我已经编写了几个过滤器,并希望让它们按顺序执行(顺序并不是特别重要)。这背后的原因?我需要编写大约20个,30个过滤器,并且不希望它们都在同一个文件中。

我读过关于Spring的DelegatingFilterProxy,但无法弄清楚如何配置它以链接我的所有grails过滤器。

3 个答案:

答案 0 :(得分:4)

自Grails 1.3.1起,您可以使用“dependsOn”关键字链接过滤器:

def dependsOn = [MyOtherFilters.class]

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

答案 1 :(得分:2)

答案 2 :(得分:2)

我可能不会在这里理解核心问题,但简单的答案可能是“它们已被链接”。过滤器是根据您放入过滤器闭包的选择器执行的(例如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}")
                }
            }
        }

    }
}