目錄自定義中介軟體
中介軟體注意事項
在web應用服務中,完整的乙個業務處理在技術上包含客戶端操作、伺服器端處理、返回處理結果給客戶端三個步驟。
在實際的業務開發和處理中,會有更負責的業務和需求場景。乙個完整的系統可能要包含鑑權認證、許可權管理、安全檢查、日誌記錄等多維度的系統支援。
鑑權認證、許可權管理、安全檢查、日誌記錄等這些保障和支援系統業務屬於全系統的業務,和具體的系統業務沒有關聯,對於系統中的所有業務都適用。
由此,在業務開發過程中,為了更好的梳理系統架構,可以將上述描述所涉及的一些通用業務單獨抽離並進行開發,然後以外掛程式化的形式進行對接。這種方式既保證了系統功能的完整,同時又有效的將具體業務和系統功能進行解耦,並且,還可以達到靈活配置的目的。
這種通用業務獨立開發並靈活配置使用的元件,一般稱之為"中介軟體",因為其位於伺服器和實際業務處理程式之間。其含義就是相當於在請求和具體的業務邏輯處理之間增加某些操作,這種以額外新增的方式不會影響編碼效率,也不會侵入到框架中。中介軟體的位置和角色示意圖如下圖所示:
在gin中,中介軟體稱之為middleware,中介軟體的型別定義如下所示:
type handlerfunc func(*context)
handlerfunc是乙個函式型別,接收乙個context引數。用於編寫程式處理函式並返回handlefunc型別,作為中介軟體的定義。
中介軟體的型別是函式,有兩條標準:
// 定義中介軟體
func requestinfos() gin.handlerfunc
}func main() )
})engine.run(":9000")
}
// 給/test2路由單獨註冊中介軟體(可註冊多個)
r.get("/test2", statcost(), func(c *gin.context) )
})
為路由組註冊中介軟體有以下兩種寫法。
寫法1:
shopgroup := r.group("/shop", statcost())
) ...
}
寫法2:
shopgroup := r.group("/shop")
shopgroup.use(statcost())
) ...
}
context.next函式可以將中介軟體**的執行順序一分為二,next函式呼叫之前的**在請求處理之前之前,當程式執行到context.next時,會中斷向下執行,轉而先去執行具體的業務邏輯,執行完業務邏輯處理函式之後,程式會再次回到context.next處,繼續執行中介軟體後續的**。
func main() )
})engine.run(":9000")
}func requestinfos() gin.handlerfunc
}
執行程式,輸出結果如下:
請求path: /query
請求method: get
中介軟體的使用方法
程式先執行①和②。
執行到③時,轉而去執行業務處理程式。
返回到中介軟體中,執行④。
gin.default()
預設使用了logger
和recovery
中介軟體,其中:
如果不想使用上面兩個預設的中介軟體,可以使用gin.new()
新建乙個沒有任何預設中介軟體的路由。
當在中介軟體或handler
中啟動新的goroutine
時,不能使用原始的上下文(c *gin.context),必須使用其唯讀副本c.copy()
。
laravel系列5 中介軟體
生成新的中介軟體使用artisan指令完成,如下 php artisan make middleware oldmiddleware namespace useclosure class oldmiddleware return next request 可以將中介軟體視作是過濾請求的層,只有滿足要...
13 2 7 中介軟體
中介軟體顧名思義,是介於request與response處理之間的一道處理過程,相對比較輕量級,並且在全域性上改變django的輸入與輸出。因為改變的是全域性,所以需要謹慎實用,用不好會影響到效能。如果你想修改請求,例如被傳送到view中的httprequest物件。或者你想修改view返回的htt...
21 中介軟體
一 中介軟體的定義 1.中介軟體是django請求 響應處理的鉤子框架,它是乙個輕量級的 低階的 外掛程式 系統,用於全域性改變django的輸入或輸出 2.中介軟體以類的形式體現 3.每個中介軟體元件負責做一些特定的功能,例如django包含乙個中介軟體元件 authenticationmiddl...