×

概要

Revel 介绍Revel 概念Revel 项目结构

Revel 控制器

Revel 控制器概要Revel 路由routesRevel 参数绑定Revel 参数验证Revel Session / FlashRevel 国际化Revel Results

Revel 模板

Revel 拦截器Revel 缓存CacheRevel 过滤器Revel Websockets

Revel 模块

Revel 模块概要Revel 测试Revel 计划任务

Revel 操作

Revel 日志类型Revel 版本控制Revel 部署

Revel 参考资料

Revel 配置文件app.confRevel 命令行工具Revel 常见问题

Revel 拦截器


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

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

在 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)
}

分类导航

关注微信下载离线手册

bootwiki移动版 bootwiki
(群号:472910771)