【问题标题】:Grails filter syntax, or, How to call a Grails Filter outside GrailsGrails 过滤器语法,或者,如何在 Grails 之外调用 Grails 过滤器
【发布时间】:2009-08-10 14:38:05
【问题描述】:

Grails 提供了filters,它在您的控制器之前运行。它们在如下所示的类中定义:

class SecurityFilters {
   def filters = {
       myFilter(controller:'*', action:'*') { // What are those weird colons??
           print "I'm filtering!"
           // Code that does the filtering goes here
       }
   }
}

这些很好用,但我想更好地理解语法,因为它看起来不像我以前见过的任何 Groovy 代码。特别是,上面以myFilter 开头的行似乎很奇怪。这是一个名为myFilter 的方法的方法定义吗?如果是这样,每个参数后面的:'*' 是什么意思?我认为这可能是一个默认参数值,但那将是='*'。我之前在方法 calls 中看到过使用冒号的命名参数,但这不可能是方法调用,因为我没有在其他任何地方定义 myFilter()

如果有人能告诉我如何从普通的 Groovy 类中执行过滤代码,我想我会更好地理解。换句话说,如果我有一个包含上述行的 MyFilters.groovy 文件,我该如何完成这个 Groovy 代码以打印“我正在过滤”?

import MyFilters
def mf = new MyFilters()
mf.filters.somethingGoesHere // Help! How do I finish this line so it calls my filtering code?

【问题讨论】:

  • 好问题松鼠!我一直在与同样的问题作斗争 - 感谢您提出这个问题!
  • 我需要知道同样的事情......我几乎无法入睡,哈哈!

标签: grails groovy filter


【解决方案1】:

以下 Groovy 代码将打印“我正在过滤!”:

class SecurityFilters {
   def filters = {
       myFilter(controller:'*', action:'*') { // What are those weird colons??
           print "I'm filtering!"
           // Code that does the filtering goes here
       }
   }   
}

class FilterDelegate {
    def methodMissing(String methodName, args) {
        // methodName == myFilter
        // args[0] == [controller:*, action:*]
        // args[1] == {print "I'm filtering!"}
        args[1].call()
    }
}

def sf = new SecurityFilters()
def filtersClosure = sf.filters
filtersClosure.delegate = new FilterDelegate()
filtersClosure.call()

在此示例中,filters 是一个闭包,它调用名为 myFilter 的方法并传递一个映射和一个闭包。您可以将 myFilter 视为:

myFilter([controller:'*', action:'*'], closure)

Map 可以包含控制器、操作或 uri 等键。当 Grails 在尝试确定要调用哪个闭包时尝试匹配来自 HTTP 请求的 URI 时,使用通配符 (*)。

我对 Grails 如何处理过滤器的理解是使用了委托加载器类。 loader 类提供了一个 methodMissing 方法,并为过滤器闭包内的每个方法调用创建一个 FilterConfig。当发出 HTTP 请求时,Grails 会查看所有 FilterConfig 对象并尝试找到匹配的范围(在映射中查找控制器、操作或 uri,并使用正则表达式匹配通配符)。如果找到匹配项,它会调用传递给 Filter 类方法的闭包。

【讨论】:

    【解决方案2】:

    您不能轻易地在 grails 之外调用过滤器,因为它们依赖于许多无法设置的管道。 line
    myFilter(controller:'', action:'')
    是一个方法定义,它接受两个参数,一个控制器和一个动作模式。 * 表示将此过滤器应用于任何进程类型的对象。例如,如果我们想确保用户在未经授权的情况下不能创建任何内容,我们将使用以下过滤器。
    controller:'*', action:'create'
    这意味着每当调用创建操作时,存储在该函数主体中的代码都会执行,但对于列表、显示或编辑,不会执行任何过滤器.如果您真的想要详细信息,您可以随时下载 grails 源代码。
    编辑:
    代码可以编译,因为它是在过滤器中定义的函数。

    【讨论】:

    • 谢谢 - 我知道过滤器及其控制器和操作模式在 Grails 中是如何工作的。但我想知道为什么上面显示的 MyFilter 代码是合法的 Groovy。它可以编译,但我不知道为什么!
    猜你喜欢
    • 1970-01-01
    • 2011-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-11
    • 1970-01-01
    相关资源
    最近更新 更多