這篇主要是了解一下 BeeGo 如何處理 HTTP 請求,以及了解 Session 的運作。
官方文件裡的 Session Module 有提到 SessionManaget 應該要是一個 global variables,但前篇提到,在使用 Session 時,其實是呼叫 Controller 所提供的函式。這中間到底發生了什麼事情?
首先依據文件裡提到的 session.NewManager() 去找,我們可以發現只有在 hooks.go 裡的 registerSession() 有使用。這裡是這樣寫的:
if GlobalSessions, err = session.NewManager(BConfig.WebConfig.Session.SessionProvider, conf); err != nil {
return err
也就是說,會把 session.NewManager() 回傳的結果指派到 GlobalSessions 與 err 裡。
再循線去找 GlobalSessions,會發現
而前面提到的 hooks.go / controller.go / config.go 都是在 package beego 裡,所以可以知道 BeeGo 內部是怎麼去處理全域變數的問題。
這部份的程式主要是在 router.go 裡的 ServeHTTP(),我是用 SessionStart() 去找 BeeGo 原始碼找到的。
大致的流程如下: