拦截器

最后更新于:2022-04-01 04:22:05

“拦截器”是框架执行一个方法之前或之后被调用的函数。它允许 [面向方面编程](http://en.wikipedia.org/wiki/Aspect-oriented_programming), 作用如下: * 请求记录 * 错误处理 * 状态保持 在 Revel 中, 有两种形式的拦截器: 1. 函数拦截器:请参考 [`InterceptorFunc`](http://gorevel.cn/docs/docs/godoc/intercept.html#InterceptorFunc) 接口. * 不能挂接到某个特定的控制器方法 * 可以应用到所有的、任意的控制器上 2. 方法拦截器:一个不带参数、并返回一个 `revel.Result`的控制器方法 * 只能拦截控制器方法 * 可以修改被调用的控制器 拦截器的执行顺序与添加位置相关 ## 拦截时间 在一个请求生命周期内,可以注册四种拦截时间: 1. BEFORE: 在请求被路由到以后,并且session, flash, 参数解析之后、控制器方法被调用之前执行拦截。 2. AFTER: 在请求返回了一个结果, 但是结果被应用之前执行拦截。如果出现了panic,拦截不会被调用。 3. PANIC: 在控制器方法中或应用结果时出现panic退出后被拦截。 4. FINALLY: 在控制器方法执行完毕并且结果被应用之后被拦截。 ## 结果 拦截器通常返回 `nil`, 在这种情况下,需要继续处理请求,不能中断。 返回一个非 `nil` `revel.Result`的效果, 取决于拦截器被调用的时间: 1. BEFORE: 没有进一步的拦截器被调用, 也不是一个控制器方法。 2. AFTER: 所有拦截器仍然可以运行。 3. PANIC: 所有拦截器仍然可以运行。 4. FINALLY: 所有拦截器仍然可以运行。 在任何情况下,返回的结果都将附加到任何现有的结果上: BEFORE:返回的结果是保证是最终的。 AFTER:它可能是一个进一步的拦截器,可以返回自己的结果。 ## 例如 ### 函数拦截器 下面是定义和注册函数拦截器的一个简单例子。 ~~~ func checkUser(c *revel.Controller) revel.Result { if user := connected(c); user == nil { c.Flash.Error("请先登录") return c.Redirect(App.Index) } return nil } func init() { revel.InterceptFunc(checkUser, revel.BEFORE, &Hotels{}) } ~~~ ### 方法拦截器 方法拦截器有两种方式的签名: ~~~ func (c AppController) example() revel.Result func (c *AppController) example() revel.Result ~~~ 下面是个同样的例子,只能拦截一个控制器。 ~~~ func (c Hotels) checkUser() revel.Result { if user := connected(c); user == nil { c.Flash.Error("请先登录") return c.Redirect(App.Index) } return nil } func init() { revel.InterceptMethod(Hotels.checkUser, revel.BEFORE) } ~~~
';