`Fitlers`过滤器链是一个中间件,它们具有单独的功能,并作为管道对请求做链式处理。过滤器链执行框架的所有功能。 对过滤器链的源码分析,请移步 Go Revel - Filter(过滤器)源码分析 http://www.cnblogs.com/hangxin1940/p/3266311.html 一个过滤器这样定义: type Filter func(c *Controller, filterChain []Filter) 没一个过滤器负责拉取下一个过滤器并执行它。下面是所有过滤器的调用堆栈: var Filters = []Filter{ PanicFilter, // 运行时异常过滤器 恢复一个 panics 运行时异常并且显示异常信息页面 RouterFilter, // 路由过滤器 根据路由器选择正确的Action FilterConfiguringFilter, // 自定义过滤器配置器 为每一个Action增加或删除自定义过滤器 ParamsFilter, // 参数转换过滤器 将请求的参数转换为 Controller.Params SessionFilter, // 会话过滤器 恢复和写入会话cookie FlashFilter, // Flash过滤器 恢复和写入Flash信息cookie ValidationFilter, // 验证过滤器 恢复保存验证错误并且从cookie中新建一个 I18nFilter, // i18n过滤器 解析请求的语言 InterceptorFilter, // 拦截器过滤器 在Action前后运行拦截器 ActionInvoker, // Action过滤器 调用Action方法 } ![golang_filters](http://images.cnblogs.com/cnblogs_com/hangxin1940/508415/o_golang-revel-filters.png "golang_filters") ##配置过滤器链 **全局配置** 应用程序可以在`init()`方法内重新分配`revel.Filters`变量中的过滤器顺序。(在使用revel生成新的应用时会在`app/init.go`中构造默认的过滤器链) func init() { revel.Filters = []Filter{ PanicFilter, // 运行时异常过滤器 恢复一个 panics 运行时异常并且显示异常信息页面 RouterFilter, // 路由过滤器 根据路由器选择正确的Action FilterConfiguringFilter, // 自定义过滤器配置器 为每一个Action增加或删除自定义过滤器 ParamsFilter, // 参数转换过滤器 将请求的参数转换为 Controller.Params SessionFilter, // 会话过滤器 恢复和写入会话cookie FlashFilter, // Flash过滤器 恢复和写入Flash信息cookie ValidationFilter, // 验证过滤器 恢复保存验证错误并且从cookie中新建一个 I18nFilter, // i18n过滤器 解析请求的语言 InterceptorFilter, // 拦截器过滤器 在Action前后运行拦截器 ActionInvoker, // Action过滤器 调用Action方法 } } 每一个请求都会按从上到下的顺序交给每个过滤器处理。 **每个Action的配置** 尽管所有请求都沿着`revel.Filters`过滤器链向下运行,但是revel也提供了`FilterConfigurator`,允许围绕`controller`或`action`方便的对其添加、插入和删除自定义过滤器栈。 `FilterConfiguringFilter`实现了这些功能,而且它本身就是一个过滤器栈。 ##实现一个过滤器 **保持管道链的继续运行** 过滤器负责调用下一个过滤器来继续对请求的处理。 var MyFilter = func(c *revel.Controller, fc []revel.Filter) { // .. 在调用之前做些处理 .. fc[0](c, fc[1:]) // 执行下一个过滤器栈. // .. 逐个退出过滤器栈 .. } **获取Controller控制器类型** 过滤器将`*Controller`类型作为地一个传入的参数,而不是实际调用的 Controller 类型,如果过滤器需要对实际调用的controller进行操作,可以使用如下技巧: var MyFilter = func(c *revel.Controller, fc []revel.Filter) { if ac, err := c.AppController.(*MyController); err == nil { // 取得一个 *MyController 实例... } fc[0](c, fc[1:]) // 执行下一个过滤器栈 }

转载于:https://www.cnblogs.com/hangxin1940/p/3269270.html

Go Revel - Filters(过滤器链)相关推荐

  1. Java培训总结:过滤器链的实现方法、配置和案例分析

    今天小千给大家分享的是Java培训总结:过滤器链的实现方法.配置和案例分析. 过滤器能够对网站中的各种内容进行过滤(页面.Servlet.图片.文件),可以在网站内容请求和响应时进行一些操作,完成一些 ...

  2. Gateway网关-过滤器链执行顺序

    过滤器执行顺序 请求进入网关会碰到三类过滤器:当前路由的过滤器.DefaultFilter.GlobalFilter 请求路由后,会将当前路由过滤器和DefaultFilter.GlobalFilte ...

  3. Java过滤器链原理解析

    在很多Java Web项目中我们会在web.xml中配置一些过滤器来拦截请求,比如下面解决乱码的编码过滤器: <filter><filter-name>encodingFilt ...

  4. SpringSecurity过滤器链汇总

    SpringSecurity过滤器链 认证过程 转载于:https://www.cnblogs.com/chenny3/p/10226123.html

  5. 授权服务框架Spring Authorization Server的过滤器链

    上一篇我们初次体验了Spring Authorization Server,很多粉丝都希望对这个新授权框架有进一步了解.所以今天我们再进一步再从配置上来了解和OAuth2.0授权服务器相关的过滤器,进 ...

  6. vue 多个filters_vue自定义filters过滤器

    官方给出 在项目中我们如果有多个filters,那么我怎么一次注册,全局可用,我们在项目里新建一个filters文件夹,如下,index.js是出口文件,readMore是一个对字符串做处理的过滤器 ...

  7. SpringSecurity过滤器链加载原理

    SpringSecurity过滤器链加载原理 通过前面十五个过滤器功能的介绍,对于SpringSecurity简单入门中的疑惑是不是在心中已经有了答案了呀? 但新的问题来了!我们并没有在web.xml ...

  8. Filter_细节_过滤器链(多个过滤器)

    过滤器链(配置多个过滤器)     * 执行顺序:如果有两个过滤器:过滤器1和过滤器2         1. 过滤器1         2. 过滤器2         3. 资源执行          ...

  9. vue中动态设置style样式和使用filters过滤器设置样式

    例如:想给图片增加高度和宽度 <el-image :class="classRotation"v-if="imageData.src !== undefined&q ...

最新文章

  1. 跟我学Springboot开发后端管理系统5:数据库读写分离
  2. linux ssh Unused,ssh免密码登录 - leopardlinux的个人空间 - OSCHINA - 中文开源技术交流社区...
  3. [Qt教程] 第43篇 进阶(三)对象树与拥有权
  4. #if DEBUG 和 if (env.IsDevelopment()) 的用法区别
  5. 常见移动机器人多角度对比分析(图片版)
  6. 贺利坚老师汇编课程28笔记:在代码段使用数据加个标号start
  7. 以下选项中表述为oracle,oracle 选择题
  8. WEB UI基础八:链接跳转到标准的工单界面
  9. SecureCRT 64位 破解版v8.1.4
  10. windows DNS服务器的配置
  11. CreateFile和WriteFile
  12. 通过创建一条链来学习区块链 (1)
  13. 【深入理解Nginx】Nginx的配置
  14. [网络安全自学篇] 七十八.XSS跨站脚本攻击案例分享及总结(二)
  15. vue weex 打电话
  16. 算法基础部分-二叉树
  17. 看EyeEm如何在产品开发中整合、运用深度学习模型
  18. ios swift view父视图(半)透明,子视图不透明
  19. 中国2007年度最大社会事件回顾
  20. springmvc(尚硅谷版)

热门文章

  1. c语言字符输出128,如何将128位整数转换为C中的十进制ASCII字符串?
  2. jooq生成records_Java 14 Records类
  3. c++中的模板_C ++中的模板
  4. 如何检查Python字典中是否存在密钥
  5. xcode swift_CocoaPods Swift XCode教程
  6. android实例教程_活动之间的Android意向处理示例教程
  7. [已解决] org.hibernate.HibernateException:没有活动事务,get无效
  8. 字符串太长 pep8_Python f字符串– PEP 498 –文字字符串插值
  9. C# 视频播放控件 wmp、vlc、aplayer
  10. 二叉树转换成森林amp;森林变成二叉树