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、FINALLY
: action
被成功执行并且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{})
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 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的设计模式综述