鍍金池/ 問答/HTML/ nodejs如何使用session

nodejs如何使用session

現(xiàn)在很多node.js項(xiàng)目都使用express來做的,不得不承認(rèn)這個(gè)框架很火熱。很多需求只需要安裝插件簡(jiǎn)單配置就可以快速應(yīng)用到項(xiàng)目中。有個(gè)問題:
如果不依賴框架,不使用第三方模塊,設(shè)計(jì)一個(gè)登陸,如何使用session和cookie,原理是什么?

回答
編輯回答
喜歡你

本來想詳細(xì)講解一下的,想想還是算了,簡(jiǎn)單列一下登錄認(rèn)證過程中,就應(yīng)該能理解了

客戶端: 我要查看用戶資料
服務(wù)端: 你沒有憑證(cookie),請(qǐng)先獲得憑證再來,獲得憑證需要你提供用戶名密碼。
客戶端: 好的,這是我的用戶名和密碼
服務(wù)端: 驗(yàn)證通過,現(xiàn)在為你生成憑證,請(qǐng)保管好,以后只認(rèn)憑證,就算阿貓阿狗拿著你的憑證來查資料,我也會(huì)給他。
。。。
客戶端:我要查用戶資料,這是我的憑證.
服務(wù)端:好的,請(qǐng)稍等,我確認(rèn)一下你的憑證是否真的,OK,是真的,資料拿去。
。。。
客戶端:我要查用戶資料,這是我的憑證.
服務(wù)端:對(duì)不起,你的憑證已經(jīng)過期失效了,請(qǐng)重新提供用戶名密碼獲得新的憑證。

OK,再來講一下怎么生成憑證和怎么驗(yàn)證憑證:

生成的條件是驗(yàn)證用戶提供的用戶名和密碼是對(duì)的,

a. 生成隨機(jī)唯一的session_id, 比如md5(用戶id+毫秒數(shù))

b. 生成session內(nèi)容,并建立session_id與session內(nèi)容的對(duì)應(yīng)關(guān)系

即服務(wù)端拿一本帳本,記錄下這個(gè)憑證(根椐標(biāo)識(shí))對(duì)應(yīng)的用戶名(一般是用戶ID)是誰,類似:
abcd123 => 'Tim',
ee22343 => 'You'

(這個(gè)對(duì)應(yīng)關(guān)系,可以保存在文件、memcache、數(shù)據(jù)庫等等,這就是用不同介質(zhì)保存session的原理)

c. 將session_id加密、簽名,寫到憑證中,返回客戶端。

用通俗語言來描述這個(gè)過程就是:

驗(yàn)證用戶名密碼正確后

服務(wù)端拿出一張紙,隨機(jī)寫上一個(gè)標(biāo)識(shí)(比如像醫(yī)生寫病歷,有一定的防偽性) ---- session_id
再拿出帳本,寫上這個(gè)“標(biāo)識(shí)”與“用戶”的關(guān)聯(lián),表示這個(gè)標(biāo)識(shí)就等同于用戶A ----session_id與session內(nèi)容關(guān)聯(lián)
給這張紙蓋上大印 ----session_id加密和防偽
將這張紙作為憑證,交給用戶 ---- 將加密后的session_id作為cookie返回。

最后,用戶下次來請(qǐng)求,帶上了憑證,服務(wù)端驗(yàn)證過程:

  1. 有憑證
  2. 看看大印是否自己的(驗(yàn)證有效性)
  3. 讀取憑證中的標(biāo)識(shí)(嗯,一般只有醫(yī)生能讀懂自己寫的東西)
  4. 拿出帳本,查找標(biāo)識(shí)對(duì)應(yīng)的用戶,有找到,驗(yàn)證成功,返回相關(guān)內(nèi)容

其它:
憑證有效期:比如可以約定,一天后就沒有用了
帳本有效期:session也是可以有效期的,比如我每隔一小時(shí)就刪除一些沒有用到的session,清理之后,就算你的憑證是真實(shí)的,但也無效了。

最后,cookie是標(biāo)準(zhǔn)實(shí)現(xiàn),無所謂自己實(shí)現(xiàn)(你可能只是需要封裝操作指令),要自己實(shí)現(xiàn)session的話,無非就是解決這幾個(gè)問題:
1)決定你的帳本(用什么方式保存)
2) 實(shí)現(xiàn)寫帳本(根據(jù)session_id寫數(shù)據(jù))
3) 實(shí)現(xiàn)讀帳本(按session_id讀數(shù)據(jù))
4) 實(shí)現(xiàn)清理帳本過期數(shù)據(jù)

2017年5月5日 14:40