创新互联Revel教程:Revel 过滤器

过滤器是Revel框架的中间件 – 是组成请求处理管道的独立的功能。他们执行框架的所有功能。

成都创新互联服务项目包括东城网站建设、东城网站制作、东城网页制作以及东城网络营销策划等。多年来,我们专注于互联网行业,利用自身积累的技术优势、行业经验、深度合作伙伴关系等,向广大中小型企业、政府机构等提供互联网行业的解决方案,东城网站推广取得了明显的社会效益与经济效益。目前,我们服务的客户以成都为中心已经辐射到东城省份的部分城市,未来相信会继续扩大服务区域并继续获得客户的支持与信任!

过滤器类型是一个简单的函数:

type Filter func(c *Controller, filterChain []Filter)

每个过滤器负责调用过滤器链中的下一个过滤器。下面是个默认的过滤器栈:

// Filters 是默认的全局过滤器集。
// 可以在程序初始化时设置它。
var Filters = []Filter{
    PanicFilter,             // 从恐慌中恢复,并显示一个错误页面。
    RouterFilter,            // 负责解析路由,并选择正确的控制器方法。
    FilterConfiguringFilter, // 用于添加/删除每个动作过滤的钩子。
    ParamsFilter,            // 解析参数到 Controller.Params 中。
    SessionFilter,           // 恢复和写入会话 cookie。
    FlashFilter,             // 恢复和写入 flash cookie。
    ValidationFilter,        // 恢复保存验证错误并保存新的Cookie中。
    I18nFilter,              // 解析请求语言。
    InterceptorFilter,       // 执行拦截器。
    ActionInvoker,           // 调用控制器。
}

过滤器链配置

全局配置

程序可以在 init() 中重写 revel.Filters 变量,来配置过滤器链 (默认在 app/init.go)。

func init() {
    // Filters 是默认的全局过滤器集。
    revel.Filters = []Filter{
        PanicFilter,             // 从恐慌中恢复,并显示一个错误页面。
        RouterFilter,            // 负责解析路由,并选择正确的控制器方法。
        FilterConfiguringFilter, // 用于添加/删除每个动作过滤的钩子。
        ParamsFilter,            // 解析参数到 Controller.Params 中。
        SessionFilter,           // 恢复和写入会话 cookie。
        FlashFilter,             // 恢复和写入 flash cookie。
        ValidationFilter,        // 恢复保存验证错误并保存新的Cookie中。
        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 {
        // 判定存在一个 *MyController 实例...
    }

    fc[0](c, fc[1:]) // 执行下一个过滤器
}

注意:这种模式往往说明拦截器可能是实现所需功能的好的机制的一个指标。

本文名称:创新互联Revel教程:Revel 过滤器
当前网址:http://www.stwzsj.com/qtweb/news35/15985.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联