在web應用中,多個請求之間共享「用戶會話」是很是必要的。但HTTP1.0協議是無狀態的。那這時Cookie就出現了。那Cookie又是如何處理的呢?javascript
Cookie的處理:java
服務端向客戶端發送Cookie 客戶端的瀏覽器把Cookie保存 而後在每次請求瀏覽器都會將Cookie發送到服務端 在HTML文檔被髮送以前,Web服務器經過傳送HTTP 包頭中的Set-Cookie 消息把一個cookie 發送到用戶的瀏覽器中,以下示例:node
Set-Cookie: name=value; Path=/; expires=Wednesday, 09-Nov-99 23:12:40 GMT;
其中比較重要的屬性:web
node.js是如何想客戶端發送cookie的呢? 有兩個中方案:redis
使用response.writeHead,代碼以下:mongodb
//設置過時時間爲一分鐘 var today = new Date(); var time = today.getTime() + 60*1000; var time2 = new Date(time); var timeObj = time2.toGMTString(); response.writeHead({ 'Set-Cookie':'myCookie="type=ninja", "language=javascript";path="/"; Expires='+timeObj+';httpOnly=true' });
缺點:使用response.writeHead只能發送一次頭部,即只能調用一次,且不能與response.render共存,不然會報錯。express
使用response.cookie,代碼示例以下:npm
response.cookie('haha', 'name1=value1&name2=value2', { maxAge:10*1000, path:'/', httpOnly:true });
語法: response.cookie('cookieName’, 'name=value[name=value…]',[options]);瀏覽器
options 每一個字段的意思在上文中都講解了,這裏再也不重複闡述了。安全
express 在 4.x 版本以後,管理session和cookies等許多模塊都再也不直接包含在express中, `而是須要單獨下載安裝相應模塊。
cookieParser安裝:
$ npm install cookie-parser
使用方法:
var express = require('express'); var cookieParser = require('cookie-parser'); var app = express(); app.use(cookieParser()); app.get('/', function (req, res) { // 檢查 session 中的 isVisit 字段是否存在 // 若是存在則增長一次,不然爲 session 設置 isVisit 字段,並初始化爲 1。 if (req.cookie.isVisit) { req.cookie.isVisit++; res.send('<p>第 ' + req.cookie.isVisit + '次來此頁面</p>'); } else { req.cookie.isVisit = 1; res.send("歡迎第一次來這裏"); console.log("Cookies: ", req.cookies); //打印cookie } }); app.listen(80);
session是另外一種記錄客戶狀態的機制,不一樣的是Cookie保存在客戶端瀏覽器中,而session保存在服務器上。
客戶端瀏覽器訪問服務器的時候,服務器把客戶端信息以某種形式記錄在服務器上,這就是session。客戶端瀏覽器再次訪問時只須要從該Session中查找該客戶的狀態就能夠了。
若是說Cookie機制是經過檢查客戶身上的「通行證」來肯定客戶身份的話,那麼session機制就是經過檢查服務器上的「客戶明細表」來確認客戶身份。
session至關於程序在服務器上創建的一份客戶檔案,客戶來訪的時候只須要查詢客戶檔案表就能夠了。
二者的區別:
因此建議:將登錄信息等重要信息存放爲session、其餘信息若是須要保留,能夠放在cookie中
跟cookie同樣都須要單獨的安裝和引用模塊, 安裝模塊:$sudo npm install express-session 主要的方法就是 session(options),其中 options 中包含可選參數,主要有:
示例:
var express = require('express'); var session = resuire('session'); var app = exoress(); app.user(session({ secret: 'hubwiz app', //secret的值建議使用隨機字符串 cookie: {maxAge: 60 * 1000 * 30} // 過時時間(毫秒) })); app.get('/', function (req, res) { if (req.session.sign) {//檢查用戶是否已經登陸 console.log(req.session);//打印session的值 res.send('welecome <strong>' + req.session.name + '</strong>, 歡迎你再次登陸'); } else {//不然展現index頁面 req.session.sign = true; req.session.name = '匯智網'; res.end('歡迎登錄!'); } }); app.listen(80);