日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
創(chuàng)新互聯(lián)Revel教程:Revel攔截器

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

創(chuàng)新互聯(lián)公司專注骨干網(wǎng)絡(luò)服務(wù)器租用10年,服務(wù)更有保障!服務(wù)器租用,雅安機(jī)房托管 成都服務(wù)器租用,成都服務(wù)器托管,骨干網(wǎng)絡(luò)帶寬,享受低延遲,高速訪問(wèn)。靈活、實(shí)現(xiàn)低成本的共享或公網(wǎng)數(shù)據(jù)中心高速帶寬的專屬高性能服務(wù)器。

  • 請(qǐng)求記錄
  • 錯(cuò)誤處理
  • 狀態(tài)保持

在 Revel 中, 有兩種形式的攔截器:

  1. 函數(shù)攔截器:請(qǐng)參考 InterceptorFunc 接口.

    • 不能掛接到某個(gè)特定的控制器方法
    • 可以應(yīng)用到所有的、任意的控制器上
  2. 方法攔截器:一個(gè)不帶參數(shù)、并返回一個(gè) revel.Result的控制器方法

    • 只能攔截控制器方法
    • 可以修改被調(diào)用的控制器

攔截器的執(zhí)行順序與添加位置相關(guān)

攔截時(shí)間

在一個(gè)請(qǐng)求生命周期內(nèi),可以注冊(cè)四種攔截時(shí)間:

  1. BEFORE: 在請(qǐng)求被路由到以后,并且session, flash, 參數(shù)解析之后、控制器方法被調(diào)用之前執(zhí)行攔截。
  2. AFTER: 在請(qǐng)求返回了一個(gè)結(jié)果, 但是結(jié)果被應(yīng)用之前執(zhí)行攔截。如果出現(xiàn)了panic,攔截不會(huì)被調(diào)用。
  3. PANIC: 在控制器方法中或應(yīng)用結(jié)果時(shí)出現(xiàn)panic退出后被攔截。
  4. FINALLY: 在控制器方法執(zhí)行完畢并且結(jié)果被應(yīng)用之后被攔截。

結(jié)果

攔截器通常返回 nil, 在這種情況下,需要繼續(xù)處理請(qǐng)求,不能中斷。

返回一個(gè)非 nil revel.Result的效果, 取決于攔截器被調(diào)用的時(shí)間:

  1. BEFORE: 沒(méi)有進(jìn)一步的攔截器被調(diào)用, 也不是一個(gè)控制器方法。
  2. AFTER: 所有攔截器仍然可以運(yùn)行。
  3. PANIC: 所有攔截器仍然可以運(yùn)行。
  4. FINALLY: 所有攔截器仍然可以運(yùn)行。

在任何情況下,返回的結(jié)果都將附加到任何現(xiàn)有的結(jié)果上:

BEFORE:返回的結(jié)果是保證是最終的。

AFTER:它可能是一個(gè)進(jìn)一步的攔截器,可以返回自己的結(jié)果。

例如

函數(shù)攔截器

下面是定義和注冊(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)
}

當(dāng)前標(biāo)題:創(chuàng)新互聯(lián)Revel教程:Revel攔截器
網(wǎng)頁(yè)鏈接:http://www.5511xx.com/article/cddcghe.html