“攔截器”是框架執(zhí)行一個(gè)方法之前或之后被調(diào)用的函數(shù)。它允許 面向方面編程, 作用如下:
在 Revel 中, 有兩種形式的攔截器:
函數(shù)攔截器:請(qǐng)參考 InterceptorFunc
接口.
方法攔截器:一個(gè)不帶參數(shù)、并返回一個(gè) revel.Result
的控制器方法
攔截器的執(zhí)行順序與添加位置相關(guān)
在一個(gè)請(qǐng)求生命周期內(nèi),可以注冊(cè)四種攔截時(shí)間:
攔截器通常返回 nil
, 在這種情況下,需要繼續(xù)處理請(qǐng)求,不能中斷。
返回一個(gè)非 nil
revel.Result
的效果, 取決于攔截器被調(diào)用的時(shí)間:
在任何情況下,返回的結(jié)果都將附加到任何現(xiàn)有的結(jié)果上:
BEFORE:返回的結(jié)果是保證是最終的。
AFTER:它可能是一個(gè)進(jìn)一步的攔截器,可以返回自己的結(jié)果。
下面是定義和注冊(cè)函數(shù)攔截器的一個(gè)簡(jiǎn)單例子。
func checkUser(c *revel.Controller) revel.Result {
if user := connected(c); user == nil {
c.Flash.Error("請(qǐng)先登錄")
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
下面是個(gè)同樣的例子,只能攔截一個(gè)控制器。
func (c Hotels) checkUser() revel.Result {
if user := connected(c); user == nil {
c.Flash.Error("請(qǐng)先登錄")
return c.Redirect(App.Index)
}
return nil
}
func init() {
revel.InterceptMethod(Hotels.checkUser, revel.BEFORE)
}
更多建議: