node中的session的具体使用

前言

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

session是什么

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

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

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

当用户请求来自应用程序的 Web 页面时,如果该用户还没有会话,则 Web 服务器将自动创建一个 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数据库中,运行后,刷新浏览器,数据库中的信息如下:

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信息。

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

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

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

最后

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

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

(0)

相关推荐

  • Node.js刷新session过期时间的实现方法推荐

    在Node.js中,我们通常使用express-session这个包来使用和管理session,保存服务端和客户端浏览器之间的会话状态.那如何才能实现当用户刷新当前页面或者点击页面上的按钮时重新刷新session的过期时间呢?类似于ASP.NET中session会话状态,只要在一定的时间内页面一直保持活动状态,session就不会过期.通过下面的代码可以实现这个功能,我们在Node.js的代码中加入下面的中间件: // use this middleware to reset cookie ex

  • 详解Node.js开发中的express-session

    什么是session session是保存在服务器端的会话.session的典型应用场景是用户登录某网站之后,将其登录信息放入session,在以后的每次请求中查询相应的登录信息以确保该用户合法.比如购物车等等经典场景 为什么要使用session 谈及session一般是在web应用的背景之下,我们知道web应用是基于HTTP协议的,而HTTP协议恰恰是一种无状态协议.也就是说,用户从A页面跳转到B页面会重新发送一次HTTP请求,而服务端在返回响应的时候是无法获知该用户在请求B页面之前做了什么的

  • Nodejs中的JWT和Session的使用

    最近的项目需要在node服务端做一个用户登录的校验以及权限拦截,专业一点叫用户认证与授权,经过一番收集资料,目前常用的有两种--JWT和Session 使用JWT JWT是JsonWebTokens的简写形式,具体是啥我就不详细写了,可以查看资料. 这里引入两个插件,express-jwt和JsonWebTokens,- JsonWebTokens:用作生成token express-jwt:用作验证指定http请求的JsonWebTokens的有效性,如果有效就将JsonWebTokens的值

  • Node.js编程中客户端Session的使用详解

    静态网站很容易扩展.你只需要全部缓存,不需要考虑从不同服务器组合有状态的内容给用户. 可惜,大多数Web应用使用有状态的内容提供个性化体验.如果你的应用可以登录,就需要记住用户的Session.经典的处理方法是客户端设置包含随机唯一Session标识的Cookie,被标识的Session数据保存到服务端. 扩展有状态服务 当扩展服务的时候,你肯定有三种选择: 不同服务端同步Session数据 不同服务端连接单点中心(获取Session) 保证用户访问同一个服务端 但都有缺陷: 同步数据增加性能开

  • PHP和NodeJs开发的应用如何共用Session

    首先了解下session的机制 客户端(浏览器中) cookie 作为键值,匹配服务器端的一个数据.然后客户端每次在 HTTP 请求里面带着那个 cookie,然后服务器端"理所当然"认为服务器端的这个数据是针对该客户端的. 某些系统喜欢把 session 内容编码后加密放在 cookie 里面 那么你可以 1.你可以共用 cookie,然后把数据放在 nodejs 和 拍黄片(Sorry,是PHP) 都可以取到的地方,例如 redis.影像中 php 默认的 session 是写他自

  • nodejs 的 session 简单使用

    session的本质使用cookie来实现. 原理大概是:http 带来服务端提前设置 cookie,服务端拿到标示用户身份的cookie, 再去固定地点(数据库,文件)检索出对应的用户身份.把身份赋值给本次请求的request,在程序处理中就知晓了用户的身份了.(在PHP,ASP或者其他服务端语言中都自动帮你实现了) 实现cookie 需要为每一个用户设置一个可以标示用户身份的cookie.可以使用如下规则 注册邮箱MD5值+密码MD5值+随机码MD5值.(仅仅举例,这可能并不是一个好的方案)

  • Node.js重新刷新session过期时间的方法

    在Node.js中,我们通常使用express-session这个包来使用和管理session,保存服务端和客户端浏览器之间的会话状态.那如何才能实现当用户刷新当前页面或者点击页面上的按钮时重新刷新session的过期时间呢?类似于ASP.NET中session会话状态,只要在一定的时间内页面一直保持活动状态,session就不会过期.通过下面的代码可以实现这个功能,我们在Node.js的代码中加入下面的中间件: // use this middleware to reset cookie ex

  • 详解nodejs express下使用redis管理session

    Session实现原理 实现请求身份验证的方式很多,其中一种广泛接受的方式是使用服务器端产生的Session ID结合浏览器的Cookie实现对Session的管理,一般来说包括以下4个步骤: 1.服务器端的产生Session ID 2.服务器端和客户端存储Session ID 3.从HTTP Header中提取Session ID 4.根据Session ID从服务器端的Hash中获取请求者身份信息 使用Express和Redis对Session管理的实现 var session = requ

  • Nodejs 和Session 原理及实战技巧小结

    一 Cookie 因为HTTP协议是没有状态的,但很多情况下是需要一些信息的,比如在用户登陆后.再次访问网站时,没法判断用户是否登陆过.于是就有了cookies,用于在浏览器端保存用户数据,它有如下特点 1 是在客户端浏览器端才有的 2 用于记录信息,大小最大为4K字节 3 如果使用了cookies,那么任何对该域名的访问都会带上cookies 目前新型网站更多的采用浏览器缓存,cookie会存在一些问题,比如你每次往服务器提交请求时,都会带上cookie,无论是你访问的是不是静态图片. coo

  • node中的session的具体使用

    前言 在上一篇中node中的cookie,对cookie进行了相关介绍,本篇将继续前行,对session进行说明. session是什么 session不就是会话嘛,那什么是会话呢? 会话是一个比连接粒度更大的概念,一次会话可能包含多次连接,每次连接都被认为是会话的一次操作. 当用户在Web页面之间跳转时,存储在 Session 对象中的变量将不会丢失,而是在整个用户会话中一直存在下去. 当用户请求来自应用程序的 Web 页面时,如果该用户还没有会话,则 Web 服务器将自动创建一个 Sessi

  • node中的cookie的具体使用

    为什么需要cookie 我们知道http是无状态的协议,无状态是什么意思呢? 我来举一个小例子来说明:比如小明在网上购物,他浏览了多个页面,购买了一些物品,这些请求在多次连接中完成,如果不借助额外的手段,那么服务器是不知道他到底购买了什么的,因为服务器压根就不知道每次请求的到底是不是小明,除非小明有一个标识来证明他是小明. 所以,网站为了辨别用户身份,进行 session 跟踪,cookie出现了. cookie是什么 简单来说,cookie就是标识. 严格来说,cookie是一些存储在客户端的

  • node中使用shell脚本的方法步骤

    背景 在开发中我们在特定的场合下可能需要一些脚本来批量处理我们的业务逻辑,在nodejs如何调用shell脚本呢? 新建 项目下新建脚本文件 touch newFile.sh 修改文件权限 chmod 777 newFile.sh 修改文件为可读可写可执行 nodejs调用 文件读取 //使用nodejs的子进程里面的文件读取方法 const { execFile } = require('child_process'); 示例 DocsService.publishAllDocs = (req

  • asp中设置session过期时间方法总结

    如果程序中没有设置session的过期时间,那么session过期时间就会按照IIS设置的过期时间来执行,IIS中session默认过期时间为20分钟,IIS中session时间可以更改 时间设置要放在前面 例如 复制代码 代码如下: Session.Timeout=30 'SEESION有效时间为30分钟 Session("ID")=Rs("id") Session("Name")=Rs("Name") Session(&q

  • 浅谈node中的exports与module.exports的关系

    因为是做前端的,对node的生态一直也比较关注,对于node中对commonJS模块化的实现给了我们很大的方便,之前对于导出的module.exports和exports一直模模糊糊,今天做一个整理 先来个js基础部分的复习 let obj1 = {} let obj2 = obj1 obj2.a = 'a' obj1.b = 'b' console.log(obj1) //{a: 'a', b: 'b'} console.log(obj2) //{a: 'a', b: 'b'} obj2 =

  • Tomcat中实现Session小结

    什么是Session 对Tomcat而言,Session是一块在服务器开辟的内存空间,其存储结构为ConcurrentHashMap: Session的目的 Http协议是一种无状态协议,即每次服务端接收到客户端的请求时,都是一个全新的请求,服务器并不知道客户端的历史请求记录: Session的主要目的就是为了弥补Http的无状态特性.简单的说,就是服务器可以利用session存储客户端在同一个会话期间的一些操作记录: 实现机制 先看两个问题,如下: 1.服务器如何判断客户端发送过来的请求是属于

  • web.py在SAE中的Session问题解决方法(使用mysql存储)

    这段时间一直想尝试着在SAE中使用Python,初步选择了Web.py框架做为开发框架,但是可怜SAE上的资料少的可怜,有点问题基本上解决不了,今天解决一个Session在Session的存储问题,在SAE中不能直接用本地文件存储,好像是权限的原因,我现在采用的是保存在mysql中,效果也不错.希望对大家有帮助.直接上代码了. index.wsgi #!/usr/bin/env python # coding: utf-8 import os import web import sae from

  • .net中的session与cookies区别及使用方法

    先介绍一下比较简单的使用方法: 给COOKIES赋值 复制代码 代码如下: Response.Cookies["uid"].Value = "20"; Response.Cookies["LoginCode"].Value = "58469"; 以上就是分别对两个COOKIES变量赋了两个不同的传,那么在使用COOKIES时,我们怎样来控制COOKIES的有效期呢,看下面:  复制代码 代码如下: Response.Cooki

  • 在ASP.NET中使用Session常见问题集锦

    在坛子里经常看到一些关于Session的问题,下面做一个总结,希望对大家有所帮助: 问:为什么Session在有些机器上偶尔会丢失?答:可能和机器的环境有关系,比如:防火墙或者杀毒软件等,尝试关闭防火墙. 问:为什么当调用Session.Abandon时并没有激发Session_End方法?答:首先Session_End方法只支持InProc(进程内的)类型的Session.其次要激发Session_End方法,必须存在Session(即系统中已经使用Session了),并且至少要完成一次请求(

随机推荐