• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

Revel 拦截器

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

“拦截器”是框架执行一个方法之前或之后被调用的函数。它允许 面向方面编程, 作用如下:

  • 请求记录
  • 错误处理
  • 状态保持

在 Revel 中, 有两种形式的拦截器:

  1. 函数拦截器:请参考 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)
}

鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
Revel 过滤器发布时间:2022-02-02
下一篇:
Revel 模板发布时间:2022-02-02
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap