有没有办法在grails应用程序中链接多个过滤器(如在Java过滤器中)?也许有春天的东西?
我已经编写了几个过滤器,并希望让它们按顺序执行(顺序并不是特别重要)。这背后的原因?我需要编写大约20个,30个过滤器,并且不希望它们都在同一个文件中。
我读过关于Spring的DelegatingFilterProxy,但无法弄清楚如何配置它以链接我的所有grails过滤器。
答案 0 :(得分:4)
自Grails 1.3.1起,您可以使用“dependsOn”关键字链接过滤器:
def dependsOn = [MyOtherFilters.class]
答案 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}")
}
}
}
}
}