本篇文章跟大家介紹一下nodejs中的cookie和session。有一定的參考價值,有需要的朋友可以參考一下,希望對大家有幫助。
相關推薦:《nodejs 教學》
用慣了框架中的插件,最近在重溫node基礎模組時也不禁在想:什麼是Cookie?什麼是Session?兩者的差異和聯繫有哪些? Node.js是否提供了對應的模組來管理儲存Session?如果沒有提供對應模組,我們應該如何實作一個類似Session管理的模組呢
Session和Cookie都是基於Web伺服器的,不同的是Cookie儲存在客戶端,而Session儲存在伺服器端。
當使用者在瀏覽網站的時候,網頁伺服器會在瀏覽器上儲存一些目前使用者的相關訊息,而在本機網頁用戶端儲存的就是Cookie資料。這樣當下次使用者再瀏覽同一個網站時,網頁伺服器就會先查看並讀取本地的cookie資料,如果有cookie就會依據cookie裡面的內容並判斷其過期時間,從而給使用者特殊的資料回傳。
cookie的使用很普遍 —— 許多支援個人化服務的網站,大多都是用cookie來辨識使用者,以方便送出為使用者量身訂做的內容,像web介面的免費email。再例如:大部分網站支援的「7天免登入」。
具體來說,cookie機制採用的是在客戶端保持狀態的方案,而session機制採用的是伺服器端保持狀態的方案。同時我們也可以看到:由於伺服器端保持狀態的方案在客戶端也需要保存一個標識,所以session機制可能需要藉助於cookie機制來達到保存標識的目的。但實際上它還有其他選擇。正統的cookie分發是透過擴展HTTP協定來達到的,伺服器透過在http的回應頭上加上一行特殊的標識,以提示瀏覽器依照指示產生對應的cookie。然而,純粹的客戶端腳本如JavaScript或VBScript也可以產生cookie —— document.cookie='xxx=xxx; expires=xxx'
。
cookie是基於session的
cookie的使用卻是由瀏覽器依照一定的原則在後台自動傳送給伺服器的。瀏覽器檢查所有儲存的cookie,如果某個cookie所聲明的作用範圍大於等於將要請求的資源所在的位置,則可把該cookie附在去請求資源的http請求頭上發送給伺服器。
Cookie的內容主要包括:名字、值、過期時間、路徑和網域。路徑與域一起構成Cookie的作用範圍。若不設定過期時間,表示這個Cookie的生命期為瀏覽器會話期間,關閉瀏覽器窗口,Cookie 就會消失。這種生命期為瀏覽器會話期的Cookie,稱為會話Cookie。會話Cookie一般不儲存在硬碟上,而是保存在記憶體裡,當然這種行為並不是規範的。若設定了過期時間,瀏覽器就會把Cookie儲存到硬碟上,關閉後再次開啟瀏覽器,這些Cookie仍然有效,直到超過設定的過期時間。
而對於儲存在記憶體裡的Cookie, 不同的瀏覽器有不同的處理方式。 Session機制是一種伺服器端的機制,伺服器使用類似散列表的結構(也可能真的使用散列表)來保存資訊。當程式需要為某個客戶端的請求建立一個Session 時,伺服器先檢查這個客戶端的請求裡是否已包含了一個Session標識(稱為Session id),如果已包含則表示以前已經為此客戶端建立過Session ,伺服器就依照Session id把這個Session檢索出來使用(檢索不到,會新建一個), 如果客戶端請求不包含Session id,則為此客戶端創建一個Session並且生成-一個與此Session相關聯的Session id, Session id的值應該是一個既不會重複,又不容易被發現其產生規律的字串,這個Session id將在本次回應中被傳回給客戶端保存。儲存這個Session id的方式可以採用Cookie,這樣在互動過程中瀏覽器可以自動按照規則把這個識別傳送給伺服器。一般這個Cookie的名字都類似SESSID。
既然session如此“重要”,我們不妨來看看session模組:
PHP內建了session方法可供調用,例如session_start
以及$_SESSION
等。但是原生的Node.js中卻沒有提供任何session管理的模組,因此我們可以自己實作一個:
根據上面對session和cookie的介紹,我們不難得到其中的邏輯
(其實,服務端檢查的是session在瀏覽器的cookie中有沒有對應的session id )
如上圖所示,客戶端首先會請求Session,而當服務端檢查客戶端中的Cookie沒有對應的Session id時,會透過-一定方式為其產生一個新的Session id,而如果Cookie中存在該Session id且沒有過期時,則直接傳回Session資料。
那麼根據如上流程示意圖以及介紹,可以為我們需要實現的模組先創建3種方法,分別是start、 newSession和cleanSessions。 start方法主要是啟動Session管理,newSession主要是為客戶端創建一個新的Session id, 而cleanSessions則是清除Session資料。
本模組應用一個Session數組來儲存系統所有的Session, 當有Session id存在時,無需新建Sessionid,而是直接讀取返回Session資料;而當Sessionid不存在時,需要創建Session id,並且將Sessionid儲存在該客戶端的Cookie中。筆者做了一個簡單的session校驗start,程式碼如下:
var start = function(req,res){ var conn = { res: res, req: req }; var cookies = {}; if(typeof conn.req.headers.cookie !== "undefined"){ //session存在时,对session进行解析,获取其中的session id conn.req.headers.cookie.split(';').forEach(function(cookie){ var parts=cookie.split('='); cookies[ parts[0].trim() ] = (parts[1] || '').trim(); }); }else{ cookies.SESSID = 0; } var SESSID = cookies.SESSID; if(typeof sessions[SESSID] !== "undefined"){ //判断服务器中是否存在该session值 session=sessions[SESSID]; if(session.expires <p>以上就是一個session簡單的校驗過程,主要思路就是透過req物件中的headers取得cookie,並對cookie進行解析取得session id,進而判斷是否存在該id值,從而傳回或產生新的session。下面我們來看下主要方法newSession的實作:</p><pre class="brush:php;toolbar:false">function newSession(res){ var chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; var SESSID = ''; for(var i = 0; i <p>當然,最後就是將整個模組暴露出去:</p><pre class="brush:php;toolbar:false">exports.start=start;
Session模組的應用程式
#我們可以在入口檔(例如app.js)中require該模組,並在HTTP的createServer函數中呼叫session.start,並將session.start傳回的物件作為一個全域物件存儲,程式碼如下:
var app=http.createServer(function(req,res){ global.sessionLib = session.start(res,req); }); //调用时 if(!sessionLib['username']){ sessionLib['username'] = 'mxc'; }
介紹完基礎模組,拿筆者的一個專案來說下框架中相關外掛程式的基本用法—— 其實是實現原理與本文所說不差一二。
const cookieSession=require('cookie-session');
(function (){ var keys=[]; for(var i=0;i<p>使用時判斷:</p><pre class="brush:php;toolbar:false"> //检查登录状态 router.use((req, res, next)=>{ if(!req.session['admin_id'] && req.url!='/login'){ //没有登录且当前不是登录页(避免redirect黑洞) res.redirect('/admin/login'); }else{ next(); } });
登入後:
req.session['admin_id']=data[0].ID;
更多程式相關知識,請造訪:程式設計影片! !
以上是一起看看nodejs中的cookie和session的詳細內容。更多資訊請關注PHP中文網其他相關文章!