session 的中文意思為「會話」,
在網路技術長期的演變與發展下,
session 基本上具有以下多重意義:
1
,也就是瀏覽器窗口打開到關閉的這段時間2
」或「保持狀態 3
」本篇內容介紹的重點在第 4 項,
也就是保持客戶端與服務器之間狀態的解決方案。
1
會話期間狹義來說又指「Server 認得 Client 的時間區間」,比方說「從登入到登出」、「開始瀏覽網頁到 cookie 失效」的期間。
2
「面向連接(Connection-oriented)」是指傳遞訊息前要事先建立一條通信線路,完整通訊包含建立連接、使用連接和釋放連接等過程。
3
「保持狀態」是指通信方能將一連串消息互相關聯,讓消息間保持依賴。
session 機制是一種服務器端的機制,
用以保持客戶端與服務器之間的狀態。
使用 session 機制的程序
在收到客戶端請求時,
會先檢查客戶端請求中
是否包含「session ID」。
如果有的話,就按照 ID 檢索
儲存在 server 的對應 session,
如果沒有的話就新建一個 session,
並生成對應的 session ID
返回給客戶端保存。
session 是一種由服務器端
保持客戶狀態的解決方案,
因此客戶端也需要有保存方法,
才能藉由 session ID 取得對應資料。
其中一種方式就是使用 cookie,
優點是可以在交互過程中自動按照規則,
將 session ID 發送給伺服器。
但 cookie 在某些狀況下會被禁止,
因此也有其他機制可在
不使用 cookie 的情況下發送 session ID。
cookie 擁有過期時間,
在預設中 cookie 存活的時間
與瀏覽器的會話期間相同,
當會話結束,cookie 也自動消失,
這種 cookie 被稱為「會話 cookie」。
會話 cookie 一般保存在記憶體中,
如果有另外設置過期時間,
就會被瀏覽器保存到硬碟上,
這樣即使關閉再打開瀏覽器,
cookie 在到期前都仍能使用。
session 機制可能需要借助 cookie 機制來達到保存標識的目的,但並非必要。
把 session ID 直接附加在 URL 路徑後方,
如果要在整個交互過程中始終保持狀態,
就必須在每個客戶端可能請求的路徑後面
都包含這個 session ID。
服務器會自動修改表單,
添加一個隱藏字段,
以便在表單提交時
能將 session ID 傳遞回服務器。
如以下表單
<form name="testform" action="/xxx">
<input type="text">
</form>
在傳遞前會被伺服器改寫成:
<form name="testform" action="/xxx">
<input type="hidden" name="jsessionid" value="ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764">
<input type="text">
</form>
談論 session 機制時常有一種誤解是:
「只要關閉瀏覽器,session 就消失了。」
但伺服器事實上並不會知道瀏覽器何時關閉,
關閉瀏覽器時真正消失的是會話 cookie,
於是使用會話 cookie 保存的
session ID 會在瀏覽器關閉時隨之丟失。
因此即便再次連上同個網站,
也沒有 session ID 來找到對應的 session。
與此對應的,由於關閉瀏覽器
不會導致 session 被刪除,
伺服器會為 session 另外設置失效時間,
當距離客戶端上一次
使用 session 的時間超過該時效,
伺服器認為客戶端已經停止動,
這時才會把 session 刪除以節省空間。
這次的 30 天鐵人賽完賽了,
最初的參賽動機,
是為了養成自己記筆記的習慣。
如今成功挑戰 30 天日更,
也算是給了自己一份動力和信心,
即便在完賽之後也要持續產出筆記。
這幾天會先調整步調,
把已有的文章整理到部落格,
之後的話應該就是
部落格跟這裡兩邊同步更新了。
感謝看到這裡的你,
程式之路只能一個人走,
但這場旅程永遠都不孤單。
在此先暫時謝幕了,
待整理好腳步後再出發吧。