【问题标题】:How to resuse filters in Grails如何在 Grails 中重用过滤器
【发布时间】:2014-07-26 20:40:42
【问题描述】:

在 Grails docs 中,它读取驻留在 /conf 中的过滤器类是按约定选择的。

我们希望将所有过滤器存储在一个插件中;有选择地配置特定的使用,但我找不到一个例子来证明这一点。

如果这是我的过滤器...

class ParameterManipulationFilters {
    def filters = {
        paramFilter(controller: '*', action: '*') {
            before = {
                if (...) {
                    doSomething()
                    return true
                }
            }
        }
    }
}

...在/conf 中一切正常,但是如果过滤器驻留在插件中怎么办?

Filters 上的docs 对与此功能相关的 spring bean 进行了说明;不确定CompositeInterceptor 是否需要手动配置才能实现。

【问题讨论】:

    标签: spring grails groovy grails-2.0


    【解决方案1】:

    插件可以像应用程序一样在grails-app/conf/ 下定义过滤器。如果应用程序使用该插件,则默认情况下该过滤器将在应用程序中运行。你不需要做任何特别的事情来实现它。

    您无需对CompositeInterceptor 执行任何操作。

    至于有选择地配置要使用的那些,您有很多选择。一种方法是允许应用程序在 Config.groovy 中启用或禁用过滤器。

    考虑一个名为alpha 的插件。在那个插件中,你定义了这样的东西......

    // grails-app/conf/alpha/JeffFilters.groovy
    package alpha
    
    class JeffFilters {
    
        def isEnabled = true
    
        def filters = {
            // only configure the filter is if is enabled...
            if(isEnabled) {
                all(controller:'*', action:'*') {
                    before = {
                        println 'JeffFilters.before is running...'
                    }
                }
            }
        }
    }
    

    插件可以执行类似的操作来启用/禁用它提供的过滤器...

    // AlphaGrailsPlugin.groovy
    class AlphaGrailsPlugin {
    
        // ...
    
        def doWithApplicationContext = { ctx ->
            if(application.config.grails.myfilterconfig?.disableJeffFilter) {
                ctx.getBean('alpha.JeffFilters')?.isEnabled = false
            }
        }
    
        // ...
    

    }

    默认情况下,alpha.JeffFilters 将被启用。应用程序(而不是插件)可以使用类似这样的方式禁用该特定过滤器...

    // grails-app/conf/Config.groovy
    
    // ...
    grails.myfilterconfig.disableJeffFilter=true
    

    当然,如果这对您的应用更有意义的话,您当然可以反过来编排它,以便默认禁用 at 过滤器。

    希望对你有帮助。

    【讨论】:

    • 看起来不错,顺便说一句,过滤器是否实现了我可以使用ctx.getBeansOfType(class) 扫描的接口?我宁愿在 doWithApplicationContext 中按类搜索,而不知道过滤器的显式名称。
    • 我不这么认为,但在doWithApplicationContext 中,您可以执行def filterNames = application.getArtefacts('Filters')*.namedef fullFilterNames = application.getArtefacts('Filters')*.fullName 之类的操作。
    • 如果您要动态发现过滤器名称,然后采用我在上面的答案中描述的方法,请小心。当然不是所有的过滤器都会有isEnabled 属性。如果你打算走这条路,你需要动态检查属性是否存在,或者做一些事情来处理这个事实。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-26
    相关资源
    最近更新 更多