node中的session的具体使用


Posted in Javascript onSeptember 14, 2018

前言

在上一篇中node中的cookie,对cookie进行了相关介绍,本篇将继续前行,对session进行说明。

session是什么

session不就是会话嘛,那什么是会话呢?

会话是一个比连接粒度更大的概念,一次会话可能包含多次连接,每次连接都被认为是会话的一次操作。

当用户在Web页面之间跳转时,存储在 Session 对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。

当用户请求来自应用程序的 Web 页面时,如果该用户还没有会话,则 Web 服务器将自动创建一个 Session 对象。当会话过期或被放弃后,服务器将终止该会话。

说了这么多,我们先来看看这货吧。

node中的session的具体使用

原来session中间件生成的session是一个对象,里面包含了cookie信息。

node中的session

首先,安装express框架,cookieParser中间件,express-session中间件

npm i express --save
npm i cookie-parser --save
npm i express-session --save

默认情况下,Express会话中间件是把session信息存储在内存中,且需要用签名cookie,所以在使cookieParser()时得给它传给一个秘钥。如果没有秘钥,则会提醒 Error: secret option required for sessions

代码如下:

var express = require('express');
var cookieParser = require('cookie-parser');
var session = require('express-session');

var app = express()
app.use(cookieParser())

const hour = 1000 * 60 * 60;
var sessionOpts = {
 // 设置密钥
 secret: 'a cool secret',
 // Forces the session to be saved back to the session store
 resave: true,
 // Forces a session that is "uninitialized" to be saved to the store.
 saveUninitialized: true,
 // 设置会话cookie名, 默认是connect.sid
 key: 'myapp_sid',
 // If secure is set to true, and you access your site over HTTP, the cookie will not be set.
 cookie: { maxAge: hour * 2, secure: false }
}
app.use(session(sessionOpts))

app.use(function(req, res, next) {
 if (req.url === '/favicon.ico') {
  return
 }

 // 同一个浏览器而言,req是同一个
 var sess = req.session;
 console.log(sess)

 if (sess.views) {
  sess.views++;
 } else {
  sess.views = 1;
 }
 res.setHeader('Content-Type', 'text/html');
 res.write('<p>views: ' + sess.views + '</p>');
 res.end();
});

app.listen(4000);

上面代码实现了一个简单的页面浏览计数功能。

运行上面代码,可以打开浏览器,不断刷新页面,观察node程序中打印的sess值。

我们发现,在同一个浏览器中刷新页面,控制台上打印的是同一个session,只不过其中的views的值变了,也就是说,多次http连接对应的是同一个会话。

session存入redis

默认情况下,Express会话中间件是把session信息存储在内存中,但在开发和生产期间,最好有一个持久化的、可扩展的数据存放你的会话数据。express社区已经创建了几个使用数据库的会话存储,包括MongoDB、Redis、Memcached、PostgreSQL以及其他数据库。但低延迟的键/值存储最适合这种易失性数据,这里我们先用redis来存储session信息。

首先,安装connect-redis模块

npm i connect-redis --save

代码如下:

var express = require('express');
var cookieParser = require('cookie-parser');
var session = require('express-session');

var RedisStore = require('connect-redis')(session);

var app = express()
app.use(cookieParser())

var options = {
 host: '127.0.0.1',
 port: 6379,
 db: 1, // Database index to use. Defaults to Redis's default (0).
 prefix: 'ID:' // Key prefix defaulting to "sess:"
 // pass: 'aaa' // Password for Redis authentication
}

const hour = 1000 * 60 * 60;
var sessionOpts = {
 store: new RedisStore(options),
 // 设置密钥
 secret: 'a cool secret',
 // Forces the session to be saved back to the session store
 resave: true,
 // Forces a session that is "uninitialized" to be saved to the store.
 saveUninitialized: true,
 // 设置会话cookie名
 key: 'myapp_sid',
 // If secure is set to true, and you access your site over HTTP, the cookie will not be set.
 cookie: { maxAge: hour * 8, secure: false }
}
app.use(session(sessionOpts)) // 如果没有secret,会提醒 Error: secret option required for sessions

app.use(function(req, res, next) {
 if (req.url === '/favicon.ico') {
  return
 }

 var sess = req.session;
 var id = req.sessionID; // session ID, 只读
 console.log(sess, id);

 if (sess.views) {
  sess.views++; // 如果放在res.end()后,不会自增
  res.setHeader('Content-Type', 'text/html');
  res.write('<p>views: ' + sess.views + '</p>');
  res.write('<p>expires in: ' + (sess.cookie.maxAge / 1000) + 's</p>');
  res.end();
 } else {
  sess.views = 1;
  res.end('welcome to the session demo. refresh!');
 }
});

app.listen(4000);

上面程序中,将会话信息存入了redis的db1数据库中,运行后,刷新浏览器,数据库中的信息如下:

node中的session的具体使用

session存入mongoDb

首先,得安装connect-mongo模块

npm i connect-mongo --save

代码如下:

var express = require('express');
var cookieParser = require('cookie-parser');
var session = require('express-session');

var MongoStore = require('connect-mongo')(session);
const hour = 1000 * 60 * 60

var app = express()
app.use(cookieParser())
app.use(session({
 secret: 'a cool secret',
 key: 'mongo_sid',
 cookie: { maxAge: hour * 8, secure: false },
 resave: true,
 saveUninitialized: true,
 store: new MongoStore({
  url: 'mongodb://@localhost:27017/demodb'
 })
}));

app.use(function(req, res, next) {
 if (req.url === '/favicon.ico') {
  return
 }

 var sess = req.session;
 var id = req.sessionID; // session ID, 只读
 console.log(sess, id);

 if (sess.views) {
  sess.views++;
 } else {
  sess.views = 1;
 }

 res.setHeader('Content-Type', 'text/html');
 res.write('<p>views: ' + sess.views + '</p>');
 res.write('<p>expires in: ' + (sess.cookie.maxAge / 1000) + 's</p>');
 res.write('<p>httpOnly: ' + sess.cookie.httpOnly + '</p>');
 res.write('<p>path: ' + sess.cookie.path + '</p>');
 res.write('<p>secure: ' + sess.cookie.secure + '</p>');
 res.end();
});

app.listen(4000);

运行后,刷新浏览器页面,在demodb数据库中的sessions集合中发现已经存入了如下session信息。

node中的session的具体使用

可能会有人问:结果是看到了,但这过程中到底发生了什么呢?

其实,当浏览器发起第一次请求时,session中间件会生成一个session对象(其中包含cookie信息),这个session对象会存入mongoDb数据库中,同时,请求返回时,浏览器客户端会自动将这个session对象中的cookie保存起来,注意哦,浏览器存的可是cookie,而不是session对象。

这个cookie有一个过期时间,比如,上面代码中设置的是8小时。也就是说,8小时后,这个cookie在浏览器中会自动消失。

最后

现在,你弄清楚session和cookie之间的关系了吗?下一篇我将对node中的密码安全进行介绍,敬请期待哦。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
动态加载js的几种方法
Oct 23 Javascript
JQuery获取当前屏幕的高度宽度的实现代码
Jul 12 Javascript
jQuery回调函数的定义及用法实例
Dec 23 Javascript
JavaScript操作Oracle数据库示例
Mar 06 Javascript
JavaScript基本数据类型及值类型和引用类型
Aug 25 Javascript
将JavaScript的jQuery库中表单转化为JSON对象的方法
Nov 17 Javascript
解决jQuery上传插件Uploadify出现Http Error 302错误的方法
Dec 18 Javascript
深入理解Angularjs向指令传递数据双向绑定机制
Dec 31 Javascript
JS实现仿UC浏览器前进后退效果的实例代码
Jul 17 Javascript
axios全局请求参数设置,请求及返回拦截器的方法
Mar 05 Javascript
jQuery实现带右侧索引功能的通讯录示例【附源码下载】
Apr 17 jQuery
通过js给网页加上水印背景实例
Jun 17 Javascript
vue3.0 CLI - 2.1 -  component 组件入门教程
Sep 14 #Javascript
vue3.0 CLI - 1 - npm 安装与初始化的入门教程
Sep 14 #Javascript
详解Vue CLI3配置解析之css.extract
Sep 14 #Javascript
vue-cli脚手架build目录下utils.js工具配置文件详解
Sep 14 #Javascript
vue3.0 CLI - 2.6 - 组件的复用入门教程
Sep 14 #Javascript
在vue项目中使用md5加密的方法
Sep 14 #Javascript
在vue项目中引用Iview的方法
Sep 14 #Javascript
You might like
PHP 彩色文字实现代码
2009/06/29 PHP
将博客园(cnblogs.com)数据导入到wordpress的代码
2013/01/06 PHP
PHP随机获取未被微信屏蔽的域名(微信域名检测)
2017/03/19 PHP
PHP simplexml_load_string()函数实例讲解
2019/02/03 PHP
js控制框架刷新
2008/08/01 Javascript
Javascript 日期对象Date扩展方法
2009/05/30 Javascript
input的focus方法使用
2010/03/13 Javascript
javascript中的prototype属性实例分析说明
2010/08/09 Javascript
Jquery+CSS3实现一款简洁大气带滑动效果的弹出层
2013/05/15 Javascript
jquery实现对联广告的方法
2015/02/05 Javascript
NodeJS中利用Promise来封装异步函数
2015/02/25 NodeJs
分享五个有用的jquery小技巧
2015/10/08 Javascript
jquery.cookie实现的客户端购物车操作实例
2015/12/24 Javascript
jQuery插件支持同一页面被多次调用
2016/02/14 Javascript
简单的分页代码js实现
2016/05/17 Javascript
JS实现JSON.stringify的实例代码讲解
2017/02/07 Javascript
正则验证小数点后面只能有两位数的方法
2017/02/28 Javascript
解决angular2 获取到的数据无法实时更新的问题
2018/08/31 Javascript
elementUI 设置input的只读或禁用的方法
2018/10/30 Javascript
基于Vue-cli快速搭建项目的完整步骤
2018/11/03 Javascript
JS中FormData类实现文件上传
2020/03/27 Javascript
Js利用正则表达式去除字符串的中括号
2020/11/23 Javascript
Python Tkinter GUI编程入门介绍
2015/03/10 Python
python实现SMTP邮件发送功能
2020/06/16 Python
Python实现桶排序与快速排序算法结合应用示例
2017/11/22 Python
uwsgi+nginx部署Django项目操作示例
2018/12/04 Python
Python matplotlib学习笔记之坐标轴范围
2019/06/28 Python
python制作一个简单的gui 数据库查询界面
2020/11/19 Python
手把手教你用Django执行原生SQL的方法
2021/02/18 Python
用CSS3来实现社交分享按钮
2014/11/11 HTML / CSS
Too Faced官网:美国知名彩妆品牌
2017/03/07 全球购物
DNA基因检测和分析:23andMe
2019/05/01 全球购物
入股协议书
2014/04/14 职场文书
租赁协议书范本
2014/04/22 职场文书
家长会欢迎词
2015/01/23 职场文书
2015年保险公司个人工作总结
2015/05/22 职场文书