nodejs中cookie、session的使用


因為http會話的無狀態性,為了標記用戶的登錄狀態,便出現了cookie。cookie分為很多種,有普通cookie、簽名cookie、json cookie等,這里主要記錄下在express應用中如何配置使用cookie及session。

cookie、session的區別:

  • cookie數據存放在客戶的瀏覽器上,session數據放在服務器上。
  • cookie不是很安全,別人可以分析存放在本地的COOKIE並進行COOKIE欺騙 考慮到安全應當使用session。
  • session會在一定時間內保存在服務器上。當訪問增多,會比較占用你服務器的性能 考慮到減輕服務器性能方面,應當使用COOKIE。
  • 單個cookie保存的數據不能超過4K,很多瀏覽器都限制一個站點最多保存20個cookie。
  • 所以建議:將登陸信息等重要信息存放為session、其他信息如果需要保留,可以放在cookie中

cookie

首先是app.js中的配置:

...
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');
...
app.use(cookieParser('this is the secret key for singed cookie'));
...

js路由中使用比較簡單:

router.post("/setCookie",function(req,res, next){
    var addr = req.body.a;
    //設置cookie,配置signed: true的話可以配置簽名cookie
  res.cookie(
"addr", addr, {maxAge: 1000*60*60*24*30,httpOnly: true}); //, signed: true next(); });
//獲取cookie
var
a = req.cookies.addr;
//var a = req.signedCookies['addr']; 獲取簽名cookie console.log(a);
直接在html頁面中通過js獲取cookie
function getCookie(objName){//獲取指定名稱的cookie的值
      var arrStr = document.cookie.split("; ");
      for(var i = 0;i < arrStr.length;i ++){
           var temp = arrStr[i].split("=");
           if(temp[0] == objName){
               jQuery("#isLogin").replaceWith("歡迎您&nbsp;<a href='/user/list/true/1' class='t-reg mrgL10' id='isLogin'>"+decodeURIComponent(temp[1])+"</a>");
               jQuery("#isLogout").replaceWith("<a href='/reguser/logout' class='t-reg mrgL10 ' id='isLogout'>退出</a>&nbsp;&nbsp;|&nbsp;&nbsp;");
           }
      }
}

 

session

app.js配置:

...
var session = require("express-session");
var cookieParser = require('cookie-parser');
...
app.use(session({
    secret: 'this is the secret for cookie',
    resave: false,
    saveUninitialized: true
}));

app.use(function (req, res, next) {
    var url = req.originalUrl;
    if (url != "/" && undefined == req.session.user) {
          res.send('<script>top.location.href="/";</script>');      //解決內嵌iframe時session攔截問題
          return;
      }
    }
    next();
});

在路由中直接通過如下設置或者獲取session數據:

var user = req.session.user;
console.dir(user);

session的清除:

req.session.destroy(function(err) {
    res.redirect('/');
})

 

將session存儲到mongodb數據庫當中:

    var session = require('express-session');
    var MongoStore = require('connect-mongo')(session); mongoose.connect('mongodb://127.0.0.1:27017/hubwiz'); //連接數據庫 mongoose.connection.on('open', function () { console.log('-----------數據庫連接成功!------------'); }); app.use(session({ secret: config.cookieSecret, //secret的值建議使用128個隨機字符串 cookie: {maxAge: 60 * 1000 * 60 * 24 * 14}, //過期時間 resave: true, // 即使 session 沒有被修改,也保存 session 值,默認為 true saveUninitialized: true, store: new mongoStore({ mongooseConnection: mongoose.connection //使用已有的數據庫連接  }) })); app.listen(80);

將session數據同步到redis中:

    var express = require('express');
    var session = require('express-session'); var RedisStore = require('connect-redis')(session); var app = express(); var options = { "host": "127.0.0.1", "port": "6379", "ttl": 60 * 60 * 24 * 30, //session的有效期為30天(秒)  }; // 此時req對象還沒有session這個屬性  app.use(session({ store: new RedisStore(options), secret: 'express is powerful' })); app.listen(80);

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM