Go Revel - Interceptors(拦截器)

interceptor拦截器是revel框架在执行一个action的前后所调用的函数。他允许以AOP方式进行开发,这种模式非常有用:

1、记录请求日志

2、错误处理

3、状态保持

在revel中,可以使用两种形式的拦截器:

1、函数拦截器:

一个满足InterceptorFunc接口的函数,它不会访问任何一个特定的controller调用;可以被应用到任意/所有的controller

2、方法拦截器:

一个无参且返回revel.Result类型的controller方法,它只会拦截已绑定的controller;可以随意的修改调用的controller

拦截器按它们的添加顺序执行。

拦截时间

拦截器可以注册并运行在一个请求的四种生命周期:

1、BEFORE: 请求被路由之后,session、flash与参数已经被正确的解码,但是还没有调用action

2、AFTER: 一个请求已经返回Result对象, 但是还没用应用这个Result,即执行action之后。如果action发生panic,则这些拦截器不会被调用

3、PANIC: 在action发生panic后,或者处理Result时抛出异常

4、FINALLYaction被成功执行并且Result被正确处理之后

Results返回值

拦截器通常返回nil,这种请跨下,拦截器将会继续往下执行。

各时段调用拦截器返回非空revel.Result时所产生的效果:

1、BEFORE: 不会再执行任何拦截器,包括action

2、AFTER: 所有的拦截器将会继续运行

3、PANIC: 所有的拦截器将会继续运行

4、FINALLY: 所有的拦截器将会继续运行

在所有情况下,任何Result返回值都将会代替现有的Result

然而,在BEFORE阶段,Result 返回值为最终的Result, 而在AFTER阶段,拦截器可能会生成自己的Result

示例

函数拦截器

下面演示了如何定义并注册一个函数拦截器:

func (c Hotels) checkUser() revel.Result {
    if user := connected(c); user == nil {
        c.Flash.Error("Please log in first")
        return c.Redirect(App.Index)
    }
    return nil
}

func init() {
    revel.InterceptMethod(Hotels.checkUser, revel.BEFORE)
}

方法拦截器

一个方法拦截器必需符合下面两种形式的签名:

func (c AppController) example() revel.Result
func (c *AppController) example() revel.Result

下面演示了只针对controller操作的拦截器:

func checkUser(c *revel.Controller) revel.Result {
    if user := connected(c); user == nil {
        c.Flash.Error("Please log in first")
        return c.Redirect(App.Index)
    }
    return nil
}

func init() {
    revel.InterceptFunc(checkUser, revel.BEFORE, &Hotels{})
}

posted on   黑暗伯爵  阅读(2374)  评论(0编辑  收藏  举报

编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

点击右上角即可分享
微信分享提示