新聞中心
過濾器是Revel框架的中間件 – 是組成請(qǐng)求處理管道的獨(dú)立的功能。他們執(zhí)行框架的所有功能。

成都創(chuàng)新互聯(lián)服務(wù)項(xiàng)目包括東城網(wǎng)站建設(shè)、東城網(wǎng)站制作、東城網(wǎng)頁制作以及東城網(wǎng)絡(luò)營銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢(shì)、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,東城網(wǎng)站推廣取得了明顯的社會(huì)效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到東城省份的部分城市,未來相信會(huì)繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!
過濾器類型是一個(gè)簡(jiǎn)單的函數(shù):
type Filter func(c *Controller, filterChain []Filter)每個(gè)過濾器負(fù)責(zé)調(diào)用過濾器鏈中的下一個(gè)過濾器。下面是個(gè)默認(rèn)的過濾器棧:
// Filters 是默認(rèn)的全局過濾器集。
// 可以在程序初始化時(shí)設(shè)置它。
var Filters = []Filter{
PanicFilter, // 從恐慌中恢復(fù),并顯示一個(gè)錯(cuò)誤頁面。
RouterFilter, // 負(fù)責(zé)解析路由,并選擇正確的控制器方法。
FilterConfiguringFilter, // 用于添加/刪除每個(gè)動(dòng)作過濾的鉤子。
ParamsFilter, // 解析參數(shù)到 Controller.Params 中。
SessionFilter, // 恢復(fù)和寫入會(huì)話 cookie。
FlashFilter, // 恢復(fù)和寫入 flash cookie。
ValidationFilter, // 恢復(fù)保存驗(yàn)證錯(cuò)誤并保存新的Cookie中。
I18nFilter, // 解析請(qǐng)求語言。
InterceptorFilter, // 執(zhí)行攔截器。
ActionInvoker, // 調(diào)用控制器。
}過濾器鏈配置
全局配置
程序可以在 init() 中重寫 revel.Filters 變量,來配置過濾器鏈 (默認(rèn)在 app/init.go)。
func init() {
// Filters 是默認(rèn)的全局過濾器集。
revel.Filters = []Filter{
PanicFilter, // 從恐慌中恢復(fù),并顯示一個(gè)錯(cuò)誤頁面。
RouterFilter, // 負(fù)責(zé)解析路由,并選擇正確的控制器方法。
FilterConfiguringFilter, // 用于添加/刪除每個(gè)動(dòng)作過濾的鉤子。
ParamsFilter, // 解析參數(shù)到 Controller.Params 中。
SessionFilter, // 恢復(fù)和寫入會(huì)話 cookie。
FlashFilter, // 恢復(fù)和寫入 flash cookie。
ValidationFilter, // 恢復(fù)保存驗(yàn)證錯(cuò)誤并保存新的Cookie中。
I18nFilter, // 解析請(qǐng)求語言。
InterceptorFilter, // 執(zhí)行攔截器。
ActionInvoker, // 調(diào)用控制器。
}
}每個(gè)請(qǐng)求沿著過濾器鏈從上到下依次執(zhí)行。
Per-Action configuration
盡管所有的請(qǐng)求都被發(fā)往過濾器鏈 revel.Filters, Revel 也提供了 過濾器配置, 允許開發(fā)者根據(jù)操作或控制器添加、插入、刪除過濾器。
此功能通過 FilterConfiguringFilter 實(shí)現(xiàn), 它本身就是一個(gè)過濾器.
實(shí)現(xiàn)一個(gè)過濾器
保持過濾器鏈能夠依次執(zhí)行
Filters 負(fù)責(zé)依次調(diào)用下一個(gè)過濾器來依次處理請(qǐng)求。這通常需要完成下面的表達(dá)式:
var MyFilter = func(c *revel.Controller, fc []revel.Filter) {
// .. 做一些預(yù)處理 ..
fc[0](c, fc[1:]) // 執(zhí)行下一個(gè)過濾器
// .. 做一些后期處理 ..
}獲取控制器類型
Filters 接受一個(gè) *Controller 類型的參數(shù), 而不是被調(diào)用的實(shí)際的控制器類型。如果過濾器需要訪問實(shí)際的控制器類型,可以這樣實(shí)現(xiàn):
var MyFilter = func(c *revel.Controller, fc []revel.Filter) {
if ac, err := c.AppController.(*MyController); err == nil {
// 判定存在一個(gè) *MyController 實(shí)例...
}
fc[0](c, fc[1:]) // 執(zhí)行下一個(gè)過濾器
}注意:這種模式往往說明攔截器可能是實(shí)現(xiàn)所需功能的好的機(jī)制的一個(gè)指標(biāo)。
網(wǎng)站欄目:創(chuàng)新互聯(lián)Revel教程:Revel 過濾器
文章起源:http://www.dlmjj.cn/article/cdgpjso.html


咨詢
建站咨詢
