过滤器是Revel框架的中间件 – 是组成请求处理管道的独立的功能。他们执行框架的所有功能。
过滤器类型是一个简单的函数:
type Filter func(c *Controller, filterChain []Filter)
每个过滤器负责调用过滤器链中的下一个过滤器。下面是个默认的过滤器栈:
var Filters = []Filter{
PanicFilter,
RouterFilter,
FilterConfiguringFilter,
ParamsFilter,
SessionFilter,
FlashFilter,
ValidationFilter,
I18nFilter,
InterceptorFilter,
ActionInvoker,
}
过滤器链配置
全局配置
程序可以在 init()
中重写 revel.Filters
变量,来配置过滤器链 (默认在 app/init.go
)。
func init() {
revel.Filters = []Filter{
PanicFilter,
RouterFilter,
FilterConfiguringFilter,
ParamsFilter,
SessionFilter,
FlashFilter,
ValidationFilter,
I18nFilter,
InterceptorFilter,
ActionInvoker,
}
}
每个请求沿着过滤器链从上到下依次执行。
Per-Action configuration
尽管所有的请求都被发往过滤器链 revel.Filters
, Revel 也提供了 过滤器配置
, 允许开发者根据操作或控制器添加、插入、删除过滤器。
此功能通过 FilterConfiguringFilter
实现, 它本身就是一个过滤器.
实现一个过滤器
保持过滤器链能够依次执行
Filters 负责依次调用下一个过滤器来依次处理请求。这通常需要完成下面的表达式:
var MyFilter = func(c *revel.Controller, fc []revel.Filter) {
fc[0](c, fc[1:])
}
获取控制器类型
Filters 接受一个 *Controller
类型的参数, 而不是被调用的实际的控制器类型。如果过滤器需要访问实际的控制器类型,可以这样实现:
var MyFilter = func(c *revel.Controller, fc []revel.Filter) {
if ac, err := c.AppController.(*MyController); err == nil {
}
fc[0](c, fc[1:])
}
注意:这种模式往往说明拦截器可能是实现所需功能的好的机制的一个指标。
请发表评论