`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{})
}

Go Revel - Interceptors(拦截器)的更多相关文章

  1. (vue.js)axios interceptors 拦截器中添加headers 属性

    (vue.js)axios interceptors 拦截器中添加headers 属性:http://www.codes51.com/itwd/4282111.html 问题: (vue.js)axi ...

  2. flume1.8 Interceptors拦截器(五)

    1. Flume Interceptors Flume有能力修改/删除流程中的events.这是在拦截器(interceptor)的帮助下完成的.拦截器(Interceptors)是实现org.apa ...

  3. springMVC之mvc:interceptors拦截器的用法

    1.配置拦截器 在springMVC.xml配置文件增加: <mvc:interceptors> <!-- 日志拦截器 --> <mvc:interceptor> ...

  4. angular之interceptors拦截器

    <!DOCTYPE html> <html ng-app="nickApp"> <head> <meta charset="UT ...

  5. springMVC <mvc:interceptors>拦截器的使用

    首先在springMVC.xml配置如下代码 <!-- 拦截器 --> <mvc:interceptors> <bean class="com.base.Acc ...

  6. angular http interceptors 拦截器使用分享

    拦截器 在开始创建拦截器之前,一定要了解 $q和延期承诺api 出于全局错误处理,身份验证或请求的任何同步或异步预处理或响应的后处理目的,希望能够在将请求移交给服务器之前拦截请求,并在将请求移交给服务 ...

  7. Interceptors - 拦截器

    1.概述 Flume有能力在运行阶段修改/删除Event,这是通过拦截器(Interceptors)来实现的. 拦截器需要实现org.apache.flume.interceptor.Intercep ...

  8. vue interceptors(拦截器)

    拦截器 顾名思义: 就是半路个您劫持, 拦截器 其实在项目和自己写demo中,总会遇到请求方面需要在请求头里面做判断或者添加一些东西, 这时候 vue 中应用中axios的 interceptors  ...

  9. vue拦截器Vue.http.interceptors.push

    刚开始学vue,github上down了一个开源项目,看源代码的时候看到了这个地方: /** * @export * @param {any} request * @param {any} next ...

  10. SpringMVC配置拦截器实现登录控制

    SpringMVC读取Cookie判断用户是否登录,对每一个action都要进行判断.之前使用jstl标签在页面上判断session如果没有登录就使用如下代码跳转到登录页面. <c:if tes ...

随机推荐

  1. spark.mllib源代码阅读-优化算法1-Gradient

    Spark中定义的损失函数及梯度,在看源代码之前,先回想一下机器学习中定义了哪些损失函数,毕竟梯度求解是为优化求解损失函数服务的. 监督学习问题是在如果空间F中选取模型f作为决策函数.对于给定的输入X ...

  2. 关于PKCS的文档资料

    关于PKCS的文档资料,在这里查找: http://www.emc.com/emc-plus/rsa-labs/standards-initiatives/public-key-cryptograph ...

  3. JSP相关知识

    1.JSP的3个编译指令 pag include taglib 2.JSP的7个动作指令 forward include useBean setProperty getProperty plugin ...

  4. Android Developers:绘制9-patch图片

    绘制9-patch图片工具让你使用可见即可得(WYSIWYG)编辑器轻松创建Nine Patch图像. 关于介绍Nine-path图片和它是如何工作的,请在2D Graphics的文档中查阅关于Nin ...

  5. GANS 资料

    https://blog.csdn.net/a312863063/article/details/83512870 目 录第一章 初步了解GANs 3 1. 生成模型与判别模型. 3 2. 对抗网络思 ...

  6. jquery判断选择元素是否存在

    有时候我们需要对jquery选择器选中的元素进行判断是否存在,如果存在才进行某些操作,不存在就不进行,那么如何判断元素是否存在,代码如下: //判断是否存在特定ID值的元素 ){ alert(&quo ...

  7. css遮罩层

    父元素:position:fixed; 让子元素居中对齐:position:absolute;top:0;bottom:0;left:0;right:0;margin:auto; <style& ...

  8. MAME模拟器使用简单教程

    平时比较喜欢玩小时候的街机游戏,一开始用Winkawas,后来改用MAME,原因无他,mame是开源软件,更新更稳定可靠,但是它也有几个问题,记录一下. 1.MAME官网:www.mamedev.or ...

  9. C#读取对象实例的值和对对象的属性自动赋值方法

    using System; using System.Data; using System.Reflection; namespace DBUtility { /// <summary> ...

  10. NonWindowJoin

    package org.apache.flink.table.runtime.join /** * Connect data for left stream and right stream. Bas ...