文档章节

nodejs中cookie、session的使用

c
 caiyezi
发布于 2016/11/08 20:24
字数 690
阅读 20
收藏 0

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

 

本文转载自:http://www.cnblogs.com/vipzhou/p/4949120.html

共有 人打赏支持
c
粉丝 1
博文 108
码字总数 0
作品 0
西安
程序员
你必须知道的session与cookie

Session本质 提到Session我们能联想到的就是用户登录功能,而本身我们使用Session的基础是通过url进行访问的,也就是使用http协议进行访问的,而http协议本身是无状态的,那么问题来了服务器...

王磊的博客
01/24
0
0
【深入浅出Node.js系列十一】Node.js开发框架Express4.x

深入浅出Node.js系列 【深入浅出Node.js系列一】什么是Node.js 【深入浅出Node.js系列二】Node.js&NPM的安装与配置 【深入浅出Node.js系列三】深入Node.js的模块机制 【深入浅出Node.js系列四...

陶邦仁
2016/01/19
282
0
使用express框架时,用MongoDB存放session时,出现错误,解决方法

使用express框架时,用MongoDB存放session时,出现错误如下: D:WorkSpacenodejsusernodemodulesconnect-mongolibconnect-mongo.js:153 throw new Error('Error connecting to database'); ......

maweitao
2014/04/11
0
0
NodeJS反序列化漏洞利用getshell

     node.js是一个服务器端的运行环境,封装了Google V8引擎,V8引擎执行JavaScript速度非常快,性能非常好。Node.js进行了一些优化并提供替代API,这使得Google V8引擎能够在非浏览器环...

嘶吼RoarTalk
08/13
0
0
OAuth 及 移动端鉴权调研

OAuth OAuth是一个解决用户无需向第三方应用提供用户名密码,让第三方应用访问用户私密资源的授权方案。 举例: 用户a,在网站B存有私密信息(年龄、邮箱、头像),而a在访问第三方网站C时,为...

马肱
05/15
0
0

没有更多内容

加载失败,请刷新页面

加载更多

20180925 df与du命令、fdisk磁盘分区

df 命令 disk filesystem的缩写,查看已挂载磁盘的总容量、使用容量、剩余容量信息。 [root@centos01 ~]# dfFilesystem 1K-blocks Used Available Use% Mounted on/dev/sda3 27...

野雪球
44分钟前
1
0
Shell编程(expect同步文件、指定host和同步文件、构建文件分发系统、批量执行命令)

expect脚本同步文件 需求:自动同步文件 实验准备: A机器:192.168.248.130 B机器:192.168.248.129 实现: 1.A机器编写4.expect脚本文件,内容如下所示: #!/usr/bin/expectset passwd "...

蛋黄_Yolks
今天
2
0
ppwjs之bootstrap颜色:背景颜色

<!DOCTYPT html><html><head><meta http-equiv="content-type" content="text/html; charset=utf-8" /><title>ppwjs欢迎您</title><link rel="icon" href="/favicon.ico" ......

ppwjs
今天
1
0
Ubuntu与 Fedora之对比

大家好。今天我将重点介绍两个流行的Linux发行版之间的一些特性和差异; Ubuntu 18.04和Fedora 28。它们都有自己的包管理; Ubuntu使用DEB,而Fedora使用RPM,但它们都具有相同的桌面环境(GNO...

linuxprobe16
今天
2
0
线性代数入门

线性代数的概念对于理解机器学习背后的原理非常重要,尤其是在深度学习领域中。它可以帮助我们更好地理解算法内部到底是怎么运行的,借此,我们就能够更好的做出决策。所以,如果你真的希望了...

牛奋Debug
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部