iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 25
1
Software Development

啥物碗Golang? 30天就Go系列 第 25

Cookie 與 Session

有過網路開發經驗的人都知道,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函數,分別是setCookiegetCookie,讓他們分別對應到不同路徑。在setCookie內,使用http.SetCookie方法來設置cookie;取用cookie的時候,我們可以直接透過關鍵字從Cookie中取值,如r.Cookie("username"),也可將全部的cookie都取出來,例如:

	cs := r.Cookies()
	fmt.Fprintln(w, cs)

在測試的時候記得要先訪問set,然後訪問get,瀏覽器就可以幫剛剛設置的cookie印出來:

username=bater

Reference


上一篇
Pointer 指標
下一篇
Golang Web Frameworks
系列文
啥物碗Golang? 30天就Go30

尚未有邦友留言

立即登入留言