插件可以按照應用程序可以定義的方式在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
當然,你可以圍繞協調它的其他方式,因此在過濾器默認情況下禁用,如果更有意義爲您的應用程序。
我希望幫助。
看起來不錯,順便說一句,過濾器實現了一個接口,我可以使用'ctx.getBeansOfType(class)'進行掃描?我寧願在「doWithApplicationContext」中按類搜索,而不知道過濾器的顯式名稱。 – raffian
我不這麼認爲,但在'doWithApplicationContext'中,您可以執行類似於'def filterNames = application.getArtefacts('Filters')*。name'或'def fullFilterNames = application.getArtefacts('Filters')*。fullName' 。 –
要小心如果您要動態發現過濾器名稱,然後強制我在上面的答案中描述的方法。當然,並非所有的過濾器都具有'isEnabled'屬性。如果你要走這條路線,你需要動態地檢查屬性是否存在,或者做一些事情來處理這個事實。 –