一個攔截器是一個框架在調用action方法前或后調用的函數. 它允許一種AOP的形式, 它經常被用于做下面幾種事情:
Request logging
Error handling
Stats keeping
在Revel里, 一個攔截器能接受兩種形式:
1. 函數攔截器: 一個函數滿足
沒有訪問特定的應用程序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")returnc.Redirect(Application.Index)
}returnnil
}
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")returnc.Redirect(Application.Index)
}returnnil
}
func init() {
rev.InterceptMethod(checkUser, rev.BEFORE)
}
至此結束