nodejs之——cookie和 session應用


在web應用中,多個請求之間共享“用戶會話”是非常必要的。但HTTP1.0協議是無狀態的。那這時Cookie就出現了。那Cookie又是如何處理的呢?

Cookie的處理:

  • 服務端向客戶端發送Cookie
  • 客戶端的瀏覽器把Cookie保存
  • 然後在每次請求瀏覽器都會將Cookie發送到服務端

在HTML文檔被髮送之前,Web服務器通過傳送HTTP 包頭中的Set-Cookie 消息把一個cookie 發送到用戶的瀏覽器中,如下示例:

    Set-Cookie: name=value; Path=/; expires=Wednesday, 09-Nov-99 23:12:40 GMT;

其中比較重要的屬性:

  • name=value:鍵值對,可以設置要保存的 Key/Value,注意這裏的 - name 不能和其他屬性項的名字一樣
  • Expires: 過期時間(秒),在設置的某個時間點後該 Cookie 就會失效,如 expires=Wednesday, 09-Nov-99 23:12:40 GMT
  • maxAge: 最大失效時間(毫秒),設置在多少後失效
  • secure: 當 secure 值爲 true 時,cookie 在 HTTP 中是無效,在 HTTPS 中才有效
  • Path: 表示 cookie 影響到的路,如 path=/。如果路徑不能匹配時,瀏覽器則不發送這個Cookie
  • httpOnly: 是微軟對COOKIE做的擴展。如果在COOKIE中設置了“httpOnly”屬性,則通過程序(JS腳本、applet等)將無法讀取到COOKIE信息,防止XSS攻擊產生

nodejs中的cookie

nodejs是如何想客戶端發送cookie的呢? 有兩個中方案:

  • 使用response.writeHead,代碼如下:

    //設置過期時間爲一分鐘
    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共存,否則會報錯。

  • 使用response.cookie,代碼示例如下:

    response.cookie('haha', 'name1=value1&name2=value2', {maxAge:10*1000, path:'/', httpOnly:true});
    

    語法: response.cookie(‘cookieName’, ‘name=value[name=value…]’,[options]);

options 每個字段的意思在上文中都講解了,這裏不再重複闡述了。

cookie的簡單使用

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) {
// 如果請求中的 cookie 存在 isVisit, 則輸出 cookie
// 否則,設置 cookie 字段 isVisit, 並設置過期時間爲1分鐘
if (req.cookies.isVisit) {
    console.log(req.cookies);
    res.send("再次歡迎訪問");
} else {
    res.cookie('isVisit', 1, {maxAge: 60 * 1000});
    res.send("歡迎第一次訪問");
    }
});
app.listen(80);

什麼是session?


session是另一種記錄客戶狀態的機制,不同的是Cookie保存在客戶端瀏覽器中,而session**保存在服務器**上。

客戶端瀏覽器訪問服務器的時候,服務器把客戶端信息以某種形式記錄在服務器上,這就是session。客戶端瀏覽器再次訪問時只需要從該Session中查找該客戶的狀態就可以了。

如果說Cookie機制是通過檢查客戶身上的“通行證”來確定客戶身份的話,那麼session機制就是通過檢查服務器上的“客戶明細表”來確認客戶身份。

session相當於程序在服務器上建立的一份客戶檔案,客戶來訪的時候只需要查詢客戶檔案表就可以了。

兩者的區別:

  • cookie數據存放在客戶的瀏覽器上,session數據放在服務器上。

  • cookie不是很安全,別人可以分析存放在本地的COOKIE並進行COOKIE欺騙 考慮到安全應當使用session。

  • session會在一定時間內保存在服務器上。當訪問增多,會比較佔用你服務器的性能 考慮到減輕服務器性能方面,應當使用COOKIE。

  • 單個cookie保存的數據不能超過4K,很多瀏覽器都限制一個站點最多保存20個cookie。

所以建議:將登陸信息等重要信息存放爲session、其他信息如果需要保留,可以放在cookie中

session的簡單應用


跟cookie一樣都需要單獨的安裝和引用模塊, 安裝模塊:$sudo npm install express-session 主要的方法就是 session(options),其中 options 中包含可選參數,主要有:

  • name: 設置 cookie 中,保存 session 的字段名稱,默認爲 connect.sid 。
  • store: session 的存儲方式,默認存放在內存中,也可以使用 redis,mongodb 等。express 生態中都有相應模塊的支持。
  • secret: 通過設置的 secret 字符串,來計算 hash 值並放在 cookie 中,使產生的 signedCookie 防篡改。
  • cookie: 設置存放 session id 的 cookie 的相關選項,默認爲 (default: { path: ‘/’, httpOnly: true, secure: false, maxAge: null })
  • genid: 產生一個新的 session_id 時,所使用的函數, 默認使用 uid2 這個 npm 包。
  • rolling: 每個請求都重新設置一個 cookie,默認爲 false。
  • resave: 即使 session 沒有被修改,也保存 session 值,默認爲 true。

    var express = require('express');
    var session = require('express-session');
    var app = express();
    
    app.use(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 {
    req.session.sign = true;
    req.session.name = '匯智網';
    res.send('歡迎登陸!');
        }
    });
    app.listen(80);
    
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章