Go Web開發之Revel - 攔截器


一個攔截器是一個框架在調用action方法前或后調用的函數. 它允許一種AOP的形式, 它經常被用於做下面幾種事情:

  • Request logging
  • Error handling
  • Stats keeping

在Revel里, 一個攔截器能接受兩種形式:

1. 函數攔截器: 一個函數滿足 InterceptorFunc 接口

  • 沒有訪問特定的應用程序Controller被調用
  • 在應用程序中可以應用於任意或全部Controller

2. 方法攔截器:一個controller的方法接受沒有參數和rev.Result的返回值

  • 可以只攔截受約束的Controller
  • 可以修改被調用的controller作為想得到的

攔截器按照被添加的順序被調用.

攔截器次數

一個攔截器能在請求生命周期被注冊並在4個點運行:

  1. BEFORE: 在請求被路由, session,flash和參數反編碼后, 但在action被調用前
  2. AFTTER: 在請求已經返回一個Result后, 但在Result被應用之前. 如果aciton產生panic這些攔截器將不會被調用
  3. PANIC: 一個panic退出一個action或提出應用返回Result后
  4. FINALLY: 在一個action完成和Result被應用后

結果

攔截器典型的返回nil, 在這種情況下請求不用攔截器並繼續處理.

返回非nil的效果 rev.Result依賴攔截器的調用.

  1. BEFORE: 沒有更深遠的攔截器被調用, action也沒有
  2. AFTTER: 全部的攔截器都在運行
  3. PANIC: 全部的攔截器都在運行
  4. 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)
}

 

至此結束


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM