會話控制
HTTP 是無狀態協議,服務器不能記錄瀏覽器的訪問狀態,也就是說服務器不
能區分中兩次請求是否由一個客戶端發出,這樣的設計嚴重阻礙的 Web 程式的設計,
如:在我們進行網購時,買了一條褲子,又買了一個手機,由于 http 協議是無狀態的,
如果不通過其他手段,服務器是不能知道用戶到底買了什么,而 Cookie 就是解決方案
之一,
Cookie
簡介
Cookie 實際上就是服務器保存在瀏覽器上的一段資訊,瀏覽器有了 Cookie 之后,
每次向服務器發送請求時都會同時將該資訊發送給服務器,服務器收到請求后,就可以
根據該資訊處理請求,
Cookie 的運行原理
- 第一次向服務器發送請求時在服務器端創建 Cookie
- 將在服務器端創建的 Cookie 以回應頭的方式發送給瀏覽器
- 以后再發送請求瀏覽器就會攜帶著該 Cookie
- 服務器得到 Cookie 之后根據 Cookie 的資訊來區分不同的用戶
創建 Cookie 并將它發送給瀏覽器
- 在服務器創建 Cookie 并將它發送給瀏覽器
服務器端代碼
func handler(w http.ResponseWriter, r *http.Request) {
cookie1 := http.Cookie{
Name: "user1",
Value: "admin",
HttpOnly: true,
}
cookie2 := http.Cookie{
Name: "user2",
Value: "superAdmin",
HttpOnly: true,
}
//將 Cookie 發送給瀏覽器,即添加第一個 Cookie
w.Header().Set("Set-Cookie", cookie1.String())
//再添加一個 Cookie
w.Header().Add("Set-Cookie", cookie2.String())
}
瀏覽器回應報文中的內容
HTTP/1.1 200 OK
Set-Cookie: user1=admin; HttpOnly
Set-Cookie: user2=superAdmin; HttpOnly
Date: Sun, 12 Aug 2018 07:24:49 GMT
Content-Length: 0
Content-Type: text/plain; charset=utf-8
- 以后每次發送請求瀏覽器都會攜帶著 Cookie
GET /cookie HTTP/1.1
Host: localhost:8080
Connection: keep-alive
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64)
AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.62
Safari/537.36
Accept:
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/
apng,*/*;q=0.8
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7
Cookie: user1=admin; user2=superAdmin
- 除了 Set 和 Add 方法之外,Go 還提供了一種更快捷的設定 Cookie 的方式,
就是通過 net/http 庫中的 SetCookie 方法
將 1)中的代碼進行修改
func handler(w http.ResponseWriter, r *http.Request) {
cookie1 := http.Cookie{
Name: "user1",
Value: "admin",
HttpOnly: true,
}
cookie2 := http.Cookie{
Name: "user2",
Value: "superAdmin",
HttpOnly: true,
}
http.SetCookie(w, &cookie1)
http.SetCookie(w, &cookie2)
}
讀取 Cookie
由于我們在發送請求時 Cookie 在請求頭中,所以我們可以通過 Request 結構中的
Header 欄位來獲取 Cookie
- 處理器端代碼
func handler(w http.ResponseWriter, r *http.Request) {
//獲取請求頭中的 Cookie
cookies := r.Header["Cookie"]
fmt.Fprintln(w, cookies)
}
- 瀏覽器中的結果
[user1=admin; user2=superAdmin]
設定 Cookie 的有效時間
Cookie 默認是會話級別的,當關閉瀏覽器之后 Cookie 將失效,我們可以通過 Cookie
結構的 MaxAge 欄位設定 Cookie 的有效時間
- 處理器端代碼
func handler(w http.ResponseWriter, r *http.Request) {
cookie := http.Cookie{
Name: "user",
Value: "persistAdmin",
HttpOnly: true,
MaxAge: 60,
}
//將 Cookie 發送給瀏覽器
w.Header().Set("Set-Cookie", cookie.String())
}
- 瀏覽器回應報文中的內容
HTTP/1.1 200 OK
Set-Cookie: user=persistAdmin; Max-Age=60; HttpOnly
Date: Sun, 12 Aug 2018 07:32:57 GMT
Content-Length: 0
Content-Type: text/plain; charset=utf-8
Cookie 的用途
- 廣告推薦
- 免登錄
Session
簡介
使用 Cookie 有一個非常大的局限,就是如果 Cookie 很多,則無形的增加了客戶
端與服務端的資料傳輸量,而且由于瀏覽器對 Cookie 數量的限制,注定我們不能再
Cookie 中保存過多的資訊,于是 Session 出現,
Session 的作用就是在服務器端保存一些用戶的資料,然后傳遞給用戶一個特殊
的 Cookie,這個 Cookie 對應著這個服務器中的一個 Session,通過它就可以獲取到保
存用戶資訊的 Session,進而就知道是那個用戶再發送請求,
Session 的運行原理
- 第一次向服務器發送請求時創建 Session,給它設定一個全球唯一的 ID(可以通過
UUID 生成) - 創建一個 Cookie,將 Cookie 的 Value 設定為 Session 的 ID 值,并將 Cookie 發送
給瀏覽器 - 以后再發送請求瀏覽器就會攜帶著該 Cookie
- 服務器獲取 Cookie 并根據它的 Value 值找到服務器中對應的 Session,也就知道了
請求是那個用戶發的
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/49390.html
標籤:Go
上一篇:goweb-動作
