翻 by:Nainse 2009年6月1日21:52:34
从1.0版本Grails开始把filters作为一个约定来支持,它们可以被人为编码或作为插件(plug-ins),独立于控制器(controller)来应用。
这些过滤器是按照它们被定义的顺序来执行的。
----------注意--------------
plug-ins的顺序是在load的时候确定的(In the case of plug-ins in the order in which the plug-ins load(
please clarify previous sentence)请一定弄清楚这句话的意思)。如果你想让一个filter在一个已知的以plug-in形式存在的filter执行后执
行的话,你必须用“dependsOn”属性来使该filter依赖于(depends on)另外的那个已知filter。 详见:http://www.grails.org/Plugin+Dependencies
-----------------------
开始定义Filters吧
首先在grails-app/conf目录下创建一个以Filters为后缀的groovy类文件,然后在该类里声明一个名字叫做filters的闭包(代码块),然后就可以
在该闭包内定义改filter的业务了。
class SomeNameFilters{ def filters = { //your filter here } }
每一个filter都有一个名字和有效域(has a name and a scope)。名字是指filter的方法名,有效域则是按照相应的命名规则命名的参数。
myFilter(controller:'*', action:'*'){ // }
有效域可以是:
1.controller和/或action与一些可选的通配符(optional wildcards)
2.URI
一些例子:
all(controller:'*', action:'*'){} justBook(controller:'book', action:'*'){} someURIs(uri:'/book/*'){} allURIs(uri:'/**'){}
Filters 拦截器(Interceptors)
在已定义好的fiters闭包内,你可以定义一些一下的过滤拦截器:
1.before:在action之前执行,可以返回false来终止所有后续的filters和action的继续执行。
2.after:在action之后执行,被view model(视图模型)作为第一个参数调用(Called with the view model as the first arguments)
3.afterView:在render到视图(view)后执行(Excuted after view rendering)
例子:
class SecurityFilters { def filters = { loginCheck(controller:'*', action:'*'){ before = { if(params.cotroller == null){ redirect(action:'login') //当你用的是Tomcat服务器,并且controller是null的时候,你必须返回true,否则会抛出异常 return true }else if(!session.user && !actionName.equals('login')){ redirect(action:'login') return false } } } } }
Filters的动态方法/属性
Filters支持大多数的在controller和tag libraries中包含的通用属性。
requset:HttpServletRequest对象
response:HttpServletResponse对象
session:HttpSession对象
servletContext:ServletContext对象
applicationContext:ApplicationContext对象
params:请求参数对象(the request parameters object)
actinoName:正在转发的action的名字
controllerName:正在转发的controller的名字
另外,Filters还支持下面的方法:
redirect render