beego過濾器

2023-11-20 18:06 更新

beego 支持自定義過濾中間件,例如安全驗證,強制跳轉(zhuǎn)等。

過濾器函數(shù)如下所示:

beego.InsertFilter(pattern string, position int, filter FilterFunc, params ...bool)

InsertFilter 函數(shù)的三個必填參數(shù),一個可選參數(shù)

  • pattern 路由規(guī)則,可以根據(jù)一定的規(guī)則進行路由,如果你全匹配可以用 *
  • position 執(zhí)行 Filter 的地方,五個固定參數(shù)如下,分別表示不同的執(zhí)行過程BeforeStatic 靜態(tài)地址之前BeforeRouter 尋找路由之前BeforeExec 找到路由之后,開始執(zhí)行相應(yīng)的 Controller 之前AfterExec 執(zhí)行完 Controller 邏輯之后執(zhí)行的過濾器FinishRouter 執(zhí)行完邏輯之后執(zhí)行的過濾器
  • filter filter 函數(shù) type FilterFunc func(*context.Context)
  • params設(shè)置 returnOnOutput 的值(默認 true), 如果在進行到此過濾之前已經(jīng)有輸出,是否不再繼續(xù)執(zhí)行此過濾器,默認設(shè)置為如果前面已有輸出(參數(shù)為true),則不再執(zhí)行此過濾器是否重置 filters 的參數(shù),默認是 false,因為在 filters 的 pattern 和本身的路由的 pattern 沖突的時候,可以把 filters 的參數(shù)重置,這樣可以保證在后續(xù)的邏輯中獲取到正確的參數(shù),例如設(shè)置了 /api/* 的 filter,同時又設(shè)置了 /api/docs/* 的 router,那么在訪問 /api/docs/swagger/abc.js 的時候,在執(zhí)行 filters 的時候設(shè)置 :splat 參數(shù)為 docs/swagger/abc.js,但是如果不清楚 filter 的這個路由參數(shù),就會在執(zhí)行路由邏輯的時候保持 docs/swagger/abc.js,如果設(shè)置了 true,就會重置 :splat 參數(shù).
AddFilter 從beego1.3 版本開始已經(jīng)廢除

如下例子所示,驗證用戶是否已經(jīng)登錄,應(yīng)用于全部的請求:

var FilterUser = func(ctx *context.Context) {
    _, ok := ctx.Input.Session("uid").(int)
    if !ok && ctx.Request.RequestURI != "/login" {
        ctx.Redirect(302, "/login")
    }
}

beego.InsertFilter("/*",beego.BeforeRouter,FilterUser)
這里需要特別注意使用 session 的 Filter 必須在 BeforeStatic 之后才能獲取,因為 session 沒有在這之前初始化。

還可以通過正則路由進行過濾,如果匹配參數(shù)就執(zhí)行:

var FilterUser = func(ctx *context.Context) {
    _, ok := ctx.Input.Session("uid").(int)
    if !ok {
        ctx.Redirect(302, "/login")
    }
}
beego.InsertFilter("/user/:id([0-9]+)",beego.BeforeRouter,FilterUser)

過濾器實現(xiàn)路由

beego1.1.2 開始 Context.Input 中增加了 RunController 和 RunMethod, 這樣我們就可以在執(zhí)行路由查找之前,在 filter 中實現(xiàn)自己的路由規(guī)則.

如下示例實現(xiàn)了如何實現(xiàn)自己的路由規(guī)則:

var UrlManager = func(ctx *context.Context) {
    // 數(shù)據(jù)庫讀取全部的 url mapping 數(shù)據(jù)
    urlMapping := model.GetUrlMapping()
    for baseurl,rule:=range urlMapping {
        if baseurl == ctx.Request.RequestURI {
            ctx.Input.RunController = rule.controller
            ctx.Input.RunMethod = rule.method
            break
        }
    }
}

beego.InsertFilter("/*",beego.BeforeRouter,UrlManager)
以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號