新聞中心
“攔截器”是框架執(zhí)行一個方法之前或之后被調(diào)用的函數(shù)。它允許 面向方面編程, 作用如下:

創(chuàng)新互聯(lián)公司專注骨干網(wǎng)絡(luò)服務(wù)器租用10年,服務(wù)更有保障!服務(wù)器租用,雅安機房托管 成都服務(wù)器租用,成都服務(wù)器托管,骨干網(wǎng)絡(luò)帶寬,享受低延遲,高速訪問。靈活、實現(xiàn)低成本的共享或公網(wǎng)數(shù)據(jù)中心高速帶寬的專屬高性能服務(wù)器。
- 請求記錄
- 錯誤處理
- 狀態(tài)保持
在 Revel 中, 有兩種形式的攔截器:
-
函數(shù)攔截器:請參考
InterceptorFunc接口.- 不能掛接到某個特定的控制器方法
- 可以應(yīng)用到所有的、任意的控制器上
-
方法攔截器:一個不帶參數(shù)、并返回一個
revel.Result的控制器方法- 只能攔截控制器方法
- 可以修改被調(diào)用的控制器
攔截器的執(zhí)行順序與添加位置相關(guān)
攔截時間
在一個請求生命周期內(nèi),可以注冊四種攔截時間:
- BEFORE: 在請求被路由到以后,并且session, flash, 參數(shù)解析之后、控制器方法被調(diào)用之前執(zhí)行攔截。
- AFTER: 在請求返回了一個結(jié)果, 但是結(jié)果被應(yīng)用之前執(zhí)行攔截。如果出現(xiàn)了panic,攔截不會被調(diào)用。
- PANIC: 在控制器方法中或應(yīng)用結(jié)果時出現(xiàn)panic退出后被攔截。
- FINALLY: 在控制器方法執(zhí)行完畢并且結(jié)果被應(yīng)用之后被攔截。
結(jié)果
攔截器通常返回 nil, 在這種情況下,需要繼續(xù)處理請求,不能中斷。
返回一個非 nil revel.Result的效果, 取決于攔截器被調(diào)用的時間:
- BEFORE: 沒有進一步的攔截器被調(diào)用, 也不是一個控制器方法。
- AFTER: 所有攔截器仍然可以運行。
- PANIC: 所有攔截器仍然可以運行。
- FINALLY: 所有攔截器仍然可以運行。
在任何情況下,返回的結(jié)果都將附加到任何現(xiàn)有的結(jié)果上:
BEFORE:返回的結(jié)果是保證是最終的。
AFTER:它可能是一個進一步的攔截器,可以返回自己的結(jié)果。
例如
函數(shù)攔截器
下面是定義和注冊函數(shù)攔截器的一個簡單例子。
func checkUser(c *revel.Controller) revel.Result {
if user := connected(c); user == nil {
c.Flash.Error("請先登錄")
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
下面是個同樣的例子,只能攔截一個控制器。
func (c Hotels) checkUser() revel.Result {
if user := connected(c); user == nil {
c.Flash.Error("請先登錄")
return c.Redirect(App.Index)
}
return nil
}
func init() {
revel.InterceptMethod(Hotels.checkUser, revel.BEFORE)
} 當前題目:創(chuàng)新互聯(lián)Revel教程:Revel攔截器
本文地址:http://www.dlmjj.cn/article/cddcghe.html


咨詢
建站咨詢
