Go Web开发之Revel - 拦截器
2013-01-07 15:18 Danny.tian 阅读(3338) 评论(0) 编辑 收藏 举报一个拦截器是一个框架在调用action方法前或后调用的函数. 它允许一种AOP的形式, 它经常被用于做下面几种事情:
- Request logging
- Error handling
- Stats keeping
在Revel里, 一个拦截器能接受两种形式:
1. 函数拦截器: 一个函数满足 InterceptorFunc 接口
- 没有访问特定的应用程序Controller被调用
- 在应用程序中可以应用于任意或全部Controller
2. 方法拦截器:一个controller的方法接受没有参数和rev.Result的返回值
- 可以只拦截受约束的Controller
- 可以修改被调用的controller作为想得到的
拦截器按照被添加的顺序被调用.
拦截器次数
一个拦截器能在请求生命周期被注册并在4个点运行:
- BEFORE: 在请求被路由, session,flash和参数反编码后, 但在action被调用前
- AFTTER: 在请求已经返回一个Result后, 但在Result被应用之前. 如果aciton产生panic这些拦截器将不会被调用
- PANIC: 一个panic退出一个action或提出应用返回Result后
- FINALLY: 在一个action完成和Result被应用后
结果
拦截器典型的返回nil, 在这种情况下请求不用拦截器并继续处理.
返回非nil的效果 rev.Result依赖拦截器的调用.
- BEFORE: 没有更深远的拦截器被调用, action也没有
- AFTTER: 全部的拦截器都在运行
- PANIC: 全部的拦截器都在运行
- FINALLY: 全部的拦截器都在运行
在所有情况下, 任何返回的Result将代替任何目前的Result.
在BEFORE情况下, 无论如何, 返回的结果保证是最终结果, 当在AFTER情况下, 它可能是一个更进一步的拦截器可以发出它自己的Result.
例子
函数拦截器
这里有一个简单的示例定义和注册一个函数拦截器.
func checkUser(c *rev.Controller) rev.Result { if user := connected(c); user == nil { c.Flash.Error("Please log in first") return c.Redirect(Application.Index) } return nil } func init() { rev.InterceptFunc(checkUser, rev.BEFORE, &Hotels{}) }
方法拦截器
一个方法拦截器签名可以是两种形式中的一个:
func (c AppController) example() rev.Result
func (c *AppController) example() rev.Result
这是个相同的示例它只操作应用程序的controller
func (c Hotels) checkUser() rev.Result { if user := connected(c); user == nil { c.Flash.Error("Please log in first") return c.Redirect(Application.Index) } return nil } func init() { rev.InterceptMethod(checkUser, rev.BEFORE) }
至此结束