node中如何使用session,打通session、cookie任督二脈(express框架之session實戰)

1.爲何使用session?
session運行在服務器端,當客戶端第一次訪問服務器時,能夠將客戶的登陸信息保存。
當客戶訪問其餘頁面時,能夠判斷客戶的登陸狀態,作出提示,至關於登陸攔截。
session能夠和redis或者數據庫等結合作持久化操做,當服務器掛掉時也不會致使某些客戶信息(購物車)丟失。


2。session的工做流程:
當瀏覽器訪問服務器併發送第一次請求時,服務器端會建立一個session對象,生成一個相似於key,value的鍵值對, 而後將key(cookie)返回到瀏覽器(客戶)端,瀏覽器下次再訪問時,攜帶key(cookie),找到對應的session(value)。 客戶的信息都保存在session中。
具體以下
建立session能夠歸納爲三個步驟:


2.1. 生成全局惟一標識符(sessionid);


2.2. 開闢數據存儲空間。通常會在內存中建立相應的數據結構,但這種狀況下,系統一旦掉電,全部的會話數據就會丟失,若是是電子商務網站,這種事故會形成嚴重的後果。不過也能夠寫到文件裏甚至存儲在數據庫中,這樣雖然會增長I/O開銷,但session能夠實現某種程度的持久化,並且更有利於session的共享;
session持久化能夠利用cookie,可使是內存,能夠redis,能夠是mongoDB
2.2.1第一種就是,在比較完密碼正取之後直接存到內存裏面去

首先須要在項目的app.js中配置session信息,而且想要使用session須要安裝兩個node的插件:
安裝完插件之後,配置基本信息:


secret:一個String類型的字符串,做爲服務器端生成session的簽名。
name:返回客戶端的key的名稱,默認爲connect.sid,也能夠本身設置。
resave:(是否容許)當客戶端並行發送多個請求時,其中一個請求在另外一個請求結束時對session進行修改覆蓋並保存。

默認爲true。可是(後續版本)有可能默認失效,因此最好手動添加。

saveUninitialized:初始化session時是否保存到存儲。默認爲true, 可是(後續版本)有可能默認失效,因此最好手動添加。

cookie:設置返回到前端key的屬性,默認值爲{ path: ‘/’, httpOnly: true, secure: false, maxAge: null }。

express-session的一些方法:

Session.destroy():刪除session,當檢測到客戶端關閉時調用。

Session.reload():當session有修改時,刷新session。

Session.regenerate():將已有session初始化。

Session.save():保存session。
配置完session後,咱們就能夠在登陸接口裏將登陸信息保存進session,這裏須要根據本身的數據結構本身定義session。


最後咱們取出session中的數據,渲染到咱們的頁面就完成了一個完整的登陸過程啦!


可是上述的發作法若是服務器不當心從新啓動的,session也就是失效了。由於內存已經消失了。沒有保存成功

2.2.2第二種用mongo作持久化,即便網站重啓也不怕,丟失
安裝



3. 將session的全局惟一標示符發送給客戶端。
問題的關鍵就在服務端如何發送這個session的惟一標識上。聯繫到HTTP協議,數據無非能夠放到請求行、頭域或Body裏,基於此,通常來講會有兩種經常使用的方式:cookie和URL重寫。
3.1. Cookie
讀者應該想到了,對,服務端只要設置Set-cookie頭就能夠將session的標識符傳送到客戶端,而客戶端此後的每一次請求都會帶上這個標識符,因爲cookie能夠設置失效時間,因此通常包含session信息的cookie會設置失效時間爲0,即瀏覽器進程有效時間。至於瀏覽器怎麼處理這個0,每一個瀏覽器都有本身的方案,但差異都不會太大(通常體如今新建瀏覽器窗口的時候);
3.2. URL重寫
所謂URL重寫,顧名思義就是重寫URL。試想,在返回用戶請求的頁面以前,將頁面內全部的URL後面所有以get參數的方式加上session標識符(或者加在path info部分等等),這樣用戶在收到響應以後,不管點擊哪一個連接或提交表單,都會在再帶上session的標識符,從而就實現了會話的保持。讀者可能會以爲這種作法比較麻煩,確實是這樣,可是,若是客戶端禁用了cookie的話,URL重寫將會是首選

前端

以下兩幅圖是筆者在Firefox的Firebug插件中的截圖,能夠看到,當我第一次訪問index.jsp時,響應頭裏包含了Set-cookie頭,而請求頭中沒有。當我再次刷新頁面時,圖二顯示在響應中不在有Set-cookie頭,而在請求頭中卻有了Cookie頭。注意一下Cookie的名字:jsessionid,顧名思義,就是session的標識符,另外能夠看到兩幅圖中的jsessionid的值是相同的,緣由筆者就再也不多解釋了。另外讀者可能在一些網站上見過在最後附加了一段形如jsessionid=xxx的URL,這就是採用URL重寫來實現的session。
(圖一,首次請求index.jsp)


(圖二,首次請求index.jsp)
相關文章
相關標籤/搜索