為什麼我會想要寫這個題目呢?聽我娓娓道來。
相信不少人都聽過 cookie (你說餅乾嗎),尤其是現在越來越多的網站,在客戶端造訪時,會跳出「為了提升您在我們網站的使用體驗,請同意使用 Cookie」,很久以前看到這句話都直接按同意,卻沒有想過到底提升什麼體驗?也可以說,那時候不在意,只要我可以使用這個網站就好。而在某個時刻產生好奇,沒有像平時一樣直接 (無腦) 按下同意,藉著 google 大神搜尋了相關的資料,沒想到冒出一個 session 的陌生單字,儘管看了很多文件,我還是覺得這個概念很抽象。因此,我才打算寫這篇文章來紀錄一下我所理解的 session 和 cookie 機制。
我先預設一下大家都知道 HTTP 是無狀態協定,簡單來說,每次客戶端對 server 發出的請求都是獨立的,這次的請求無法得知上次請求的內容。舉個例子,唸大學的時候,我很常光顧某早餐店(因為他們家的起司蛋餅很好吃),頭幾天,老闆都會問我:「要吃什麼?」,我一如往常:「起司蛋餅和無糖豆漿」。然而有一天,老闆看到我,不是問我要吃什麼,而是問「一樣嗎?」 (不知道是生意不好,還是我真的令他印象深刻)。我想表達的是,前幾天老闆認不得我,所以每天都像新的開始,每天都會問我要吃什麼,「不認得」這件事就是沒有狀態。但是有一天卻問了一樣嗎,表示老闆記得我這個人,也記得我之前都點了什麼,「記得」這件事就是有狀態。
回歸這小節要講的是 session,代表的是一個「狀態」,是一種讓請求變成 stateful 的機制。一個實際應用就是購物車。比方說現在加入購物車的東西打算要結帳了,卻發現有個東西沒有買到,跳回剛剛的頁面繼續買其他東西,再回到購物車時,購物車不會被清空。
那要怎麼實作 session 呢?
pchome.com.tw
上打算購買一台電腦,和一個滑鼠,當他點擊加入購物車的瞬間,瀏覽器送了一個請求到 server,網址就會變成pchome.com.tw/product1=computer&product2=mouse
。最後按下送出訂單時,server 就可以抓取到網址上的資訊來得知目前的狀態為何,也就可以判斷小明的購物車買了什麼。參考資料:
白話 Session 與 Cookie:從經營雜貨店開始
麥克的半路出家筆記
學無止盡,每天都要進步一點點!