有過網路開發經驗的人都知道,http是一種無狀態的協定。所謂「無狀態」代表著每一次的request與response都可以視為獨立事件。這在web 1.0的時代或許還行得通,但我們每天使用臉書等網站都有紀錄使用者的狀態啊(例如說登入),這件事是怎麼做到的呢?
答案就是透過Cookie 與 Session。當使用者登入以後,就會在伺服器端產生一筆session紀錄,接著將session id透過cookie儲存在使用者的瀏覽器當中。這樣使用者點選下一個畫面,甚至是關掉瀏覽器再重新打開,只要瀏覽器中的cookie紀錄還在,就會跟request一起在session中尋找相符的使用者資訊,然後與其他資料做串接處理,最終回到使用者的瀏覽器。
golang內建cookie機制,但是沒有內建session。我們今天透過簡單的例子來看看go要怎麼實作儲存cookie然後再取用它:
package main
import (
"fmt"
"net/http"
)
func setCookie(w http.ResponseWriter, r *http.Request) {
c := http.Cookie{
Name: "username",
Value: "bater",
HttpOnly: true,
}
http.SetCookie(w, &c)
}
func getCookie(w http.ResponseWriter, r *http.Request) {
c, err := r.Cookie("username")
if err != nil {
fmt.Fprintln(w, "Cannot get cookie")
}
fmt.Fprintln(w, c)
}
func main() {
server := http.Server{
Addr: "127.0.0.1:3000",
}
http.HandleFunc("/cookie/set", setCookie)
http.HandleFunc("/cookie/get", getCookie)
server.ListenAndServe()
}
我們先宣告兩個HandleFunc
函數,分別是setCookie
與getCookie
,讓他們分別對應到不同路徑。在setCookie
內,使用http.SetCookie
方法來設置cookie;取用cookie的時候,我們可以直接透過關鍵字從Cookie中取值,如r.Cookie("username")
,也可將全部的cookie都取出來,例如:
cs := r.Cookies()
fmt.Fprintln(w, cs)
在測試的時候記得要先訪問set,然後訪問get,瀏覽器就可以幫剛剛設置的cookie印出來:
username=bater