Go Revel - Filters(過濾器鏈)
`Fitlers`過濾器鏈是一個中間件,它們具有單獨的功能,并作為管道對請求做鏈式處理。過濾器鏈執行框架的所有功能。
對過濾器鏈的源碼分析,請移步 Go Revel - Filter(過濾器)源碼分析 http://www.rzrgm.cn/hangxin1940/p/3266311.html
一個過濾器這樣定義:
type Filter func(c *Controller, filterChain []Filter)
沒一個過濾器負責拉取下一個過濾器并執行它。下面是所有過濾器的調用堆棧:
var Filters = []Filter{
PanicFilter, // 運行時異常過濾器 恢復一個 panics 運行時異常并且顯示異常信息頁面
RouterFilter, // 路由過濾器 根據路由器選擇正確的Action
FilterConfiguringFilter, // 自定義過濾器配置器 為每一個Action增加或刪除自定義過濾器
ParamsFilter, // 參數轉換過濾器 將請求的參數轉換為 Controller.Params
SessionFilter, // 會話過濾器 恢復和寫入會話cookie
FlashFilter, // Flash過濾器 恢復和寫入Flash信息cookie
ValidationFilter, // 驗證過濾器 恢復保存驗證錯誤并且從cookie中新建一個
I18nFilter, // i18n過濾器 解析請求的語言
InterceptorFilter, // 攔截器過濾器 在Action前后運行攔截器
ActionInvoker, // Action過濾器 調用Action方法
}

##配置過濾器鏈
**全局配置**
應用程序可以在`init()`方法內重新分配`revel.Filters`變量中的過濾器順序。(在使用revel生成新的應用時會在`app/init.go`中構造默認的過濾器鏈)
func init() {
revel.Filters = []Filter{
PanicFilter, // 運行時異常過濾器 恢復一個 panics 運行時異常并且顯示異常信息頁面
RouterFilter, // 路由過濾器 根據路由器選擇正確的Action
FilterConfiguringFilter, // 自定義過濾器配置器 為每一個Action增加或刪除自定義過濾器
ParamsFilter, // 參數轉換過濾器 將請求的參數轉換為 Controller.Params
SessionFilter, // 會話過濾器 恢復和寫入會話cookie
FlashFilter, // Flash過濾器 恢復和寫入Flash信息cookie
ValidationFilter, // 驗證過濾器 恢復保存驗證錯誤并且從cookie中新建一個
I18nFilter, // i18n過濾器 解析請求的語言
InterceptorFilter, // 攔截器過濾器 在Action前后運行攔截器
ActionInvoker, // Action過濾器 調用Action方法
}
}
每一個請求都會按從上到下的順序交給每個過濾器處理。
**每個Action的配置**
盡管所有請求都沿著`revel.Filters`過濾器鏈向下運行,但是revel也提供了`FilterConfigurator`,允許圍繞`controller`或`action`方便的對其添加、插入和刪除自定義過濾器棧。
`FilterConfiguringFilter`實現了這些功能,而且它本身就是一個過濾器棧。
##實現一個過濾器
**保持管道鏈的繼續運行**
過濾器負責調用下一個過濾器來繼續對請求的處理。
var MyFilter = func(c *revel.Controller, fc []revel.Filter) {
// .. 在調用之前做些處理 ..
fc[0](c, fc[1:]) // 執行下一個過濾器棧.
// .. 逐個退出過濾器棧 ..
}
**獲取Controller控制器類型**
過濾器將`*Controller`類型作為地一個傳入的參數,而不是實際調用的 Controller 類型,如果過濾器需要對實際調用的controller進行操作,可以使用如下技巧:
var MyFilter = func(c *revel.Controller, fc []revel.Filter) {
if ac, err := c.AppController.(*MyController); err == nil {
// 取得一個 *MyController 實例...
}
fc[0](c, fc[1:]) // 執行下一個過濾器棧
}
浙公網安備 33010602011771號