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);

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏IT笔记

Nginx学习之定时切割日志

Nginx日志默认情况下写入到一个文件中,为了区分各个域下的日志,我们一般会分开存储。即时这样,文件也会变的越来越大,非常不方便查看分析。通常我们是以每日来做统...

723
来自专栏pangguoming

Android 6.0 Permission权限与安全机制

Marshmallow版本权限修改   android的权限系统一直是首要的安全概念,因为这些权限只在安装的时候被询问一次。一旦安装了,app可以在用户毫不知晓...

3484
来自专栏北京马哥教育

原创投稿 | 详解Mysql数据库恢复误删除数据

糖豆贴心提醒,本文阅读时间5分钟 血的教训,事发经过就不详述了。直接上操作步骤及恢复思路(友情提示:数据库的任何操作都要提前做好备份),以下是Mysql数据后...

3029
来自专栏维C果糖

史上最简单的 MySQL 教程(三十六)「数据备份与还原(中)」

数据备份与还原的方式有很多种,具体可以分为:数据表备份、单表数据备份、SQL备份和增量备份。

38311
来自专栏菩提树下的杨过

hadoop: hive 1.2.0 在mac机上的安装与配置

环境:mac OS X Yosemite + hadoop 2.6.0 + hive 1.2.0 + jdk 1.7.0_79 前提:hadoop必须先安装,且...

2228
来自专栏我的博客

TP入门第四天

1、URL大小写 默认配置:’URL_CASE_INSENSITIVE’  => false,   // URL地址是否不区分大小写 这样默认情况下是区分大小写...

2915
来自专栏虚拟化云计算

guestfs这么强大你知道吗

libguestfs 是Redhat开源的一组工具集,主要用来访问和修改虚拟机的磁盘。其功能非常强大,我们常用的监控虚拟机磁盘使用率、P2V、V2V、备份克隆虚...

3625
来自专栏xcywt

《Linux命令行与shell脚本编程大全》第十六章 控制脚本

一些控制脚本的方式:向脚本发送信号、修改脚本优先级,在脚本运行时切换到运行模式  16.1 处理信号 linux利用信号与运行在系统中的进程进行通信。 也可以通...

1876
来自专栏小狼的世界

利用Logstash插件进行Elasticsearch与Mysql的数据

Logstash与Elasticsearch的安装就不多说了,我之前有两篇文章写的比较详细了ElasticSearch + Logstash + Kibana ...

1201
来自专栏杨建荣的学习笔记

MySQL 5.7安装部署总结(r10笔记第77天)

之前搭建MySQL环境都是使用公司内部使用的脚本,其实说实话屏蔽了很多细节,对MySQL的安装还是了解比较肤浅,今天有个MySQL 5.7的数据迁移的任务,也...

34814

扫码关注云+社区