iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 14
0
Modern Web

BeeGo系列 第 14

Session(2)

  • 分享至 

  • xImage
  •  

這篇主要是了解一下 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,會發現

  1. hooks.go 裡沒有宣告這個變數,只有在 config.go 裡有宣告。
  2. controller.go 裡有引用到 GlobalSessions ,並且使用它來產生 session id,並處理後續的資源釋放。

而前面提到的 hooks.go / controller.go / config.go 都是在 package beego 裡,所以可以知道 BeeGo 內部是怎麼去處理全域變數的問題。

處理 HTTP 請求

這部份的程式主要是在 router.go 裡的 ServeHTTP(),我是用 SessionStart() 去找 BeeGo 原始碼找到的。

大致的流程如下:

  1. 處理網址大小寫
  2. 處理錯的 HTTP method
  3. 處理靜態檔案
  4. 解析 Form / MultiForm
  5. 啟動 Session,並且利用 defer 預先埋下未來回收的處理。
  6. 依據網址找到對應的 Controller 處理函式,沒找到就回應 404 not found
  7. 執行 middleware filter
  8. 檢查存取政策
  9. 最後就是執行

上一篇
Session(1)
下一篇
Middleware / Filter(1)
系列文
BeeGo30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言