一個攔截器是一個框架在調用action方法前或后調用的函數. 它允許一種AOP的形式, 它經常被用於做下面幾種事情:
- Request logging
- Error handling
- Stats keeping
在Revel里, 一個攔截器能接受兩種形式:
1. 函數攔截器: 一個函數滿足 InterceptorFunc 接口
- 沒有訪問特定的應用程序Controller被調用
- 在應用程序中可以應用於任意或全部Controller
2. 方法攔截器:一個controller的方法接受沒有參數和rev.Result的返回值
- 可以只攔截受約束的Controller
- 可以修改被調用的controller作為想得到的
攔截器按照被添加的順序被調用.
攔截器次數
一個攔截器能在請求生命周期被注冊並在4個點運行:
- BEFORE: 在請求被路由, session,flash和參數反編碼后, 但在action被調用前
- AFTTER: 在請求已經返回一個Result后, 但在Result被應用之前. 如果aciton產生panic這些攔截器將不會被調用
- PANIC: 一個panic退出一個action或提出應用返回Result后
- FINALLY: 在一個action完成和Result被應用后
結果
攔截器典型的返回nil, 在這種情況下請求不用攔截器並繼續處理.
返回非nil的效果 rev.Result依賴攔截器的調用.
- BEFORE: 沒有更深遠的攔截器被調用, action也沒有
- AFTTER: 全部的攔截器都在運行
- PANIC: 全部的攔截器都在運行
- 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) }
至此結束