0

0

一起看看nodejs中的cookie和session

青灯夜游

青灯夜游

发布时间:2021-03-09 10:05:12

|

1975人浏览过

|

来源于csdn

转载

本篇文章给大家介绍一下nodejs中的cookiesession。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。

一起看看nodejs中的cookie和session

相关推荐:《nodejs 教程

用惯了框架中的插件,最近在重温node基础模块时也不禁在想:什么是Cookie?什么是Session?两者的区别和联系有哪些?Node.js是否提供了相应的模块来管理存储Session?如果没有提供相应模块,我们应该如何实现一个类似Session管理的模块呢

Cookie和Session

Session和Cookie都是基于Web服务器的,不同的是Cookie存储在客户端,而Session存储在服务器端。
当用户在浏览网站的时候,Web服务器会在浏览器上存储一些当前用户的相关信息,而在本地Web客户端存储的就是Cookie数据。这样当下次用户再浏览同一个网站时,Web服务器就会先查看并读取本地的cookie资料,如果有cookie就会依据cookie里面的内容并判断其过期时间,从而给用户特殊的数据返回。

cookie的使用很普遍 —— 许多支持个性化服务的网站,大多都是用cookie来辨认使用者,以方便送出为使用者量身定做的内容,像web接口的免费email。再比如:大多网站支持的“7天免登录”。
具体来说,cookie机制采用的是在客户端保持状态的方案,而session机制采用的是在服务器端保持状态的方案。同时我们也可以看到:由于服务器端保持状态的方案在客户端也需要保存一个标识,所以session机制可能需要借助于cookie机制来达到保存标识的目的。但实际上它还有其他选择。正统的cookie分发是通过扩展HTTP协议来达到的,服务器通过在http的响应头上加上一行特殊的标识,以提示浏览器按照指示生成相应的cookie。然而,纯粹的客户端脚本如JavaScript或者VBScript也可以生成cookie —— document.cookie='xxx=xxx; expires=xxx'

cookie是基于session的

cookie的使用却是由浏览器按照一定的原则在后台自动发送给服务器的。浏览器检查所有存储的cookie,如果某个cookie所声明的作用范围大于等于将要请求的资源所在的位置,则可把该cookie附在去请求资源的http请求头上发送给服务器。
Cookie的内容主要包括:名字、值、过期时间、路径和域。路径与域一起构成Cookie的作用范围。若不设置过期时间,则表示这个Cookie的生命期为浏览器会话期间,关闭浏览器窗口,Cookie 就消失。这种生命期为浏览器会话期的Cookie,被称为会话Cookie。会话Cookie一般不存储在硬盘上,而是保存在内存里,当然这种行为并不是规范的。若设置了过期时间,浏览器就会把Cookie保存到硬盘上,关闭后再次打开浏览器,这些Cookie仍然有效,直到超过设定的过期时间。

而对于保存在内存里的Cookie, 不同的浏览器有不同的处理方式。Session机制是一种服务器端的机制,服务器使用类似于散列表的结构(也可能真的使用散列表)来保存信息。当程序需要为某个客户端的请求创建一个 Session 时,服务器首先检查这个客户端的请求里是否已包含了一个Session标识(称为Session id),如果已包含则说明以前已经为此客户端创建过Session,服务器就按照Session id把这个Session检索出来使用(检索不到,会新建一个), 如果客户端请求不包含Session id,则为此客户端创建一个Session并且生成-一个与此Session相关联的Session id, Session id的值应该是一个既不会重复,又不容易被发现其生成规律的字符串,这个Session id将在本次响应中被返回给客户端保存。保存这个Session id的方式可以采用Cookie,这样在交互过程中浏览器可以自动按照规则把这个标识发送给服务器。一般这个Cookie的名字都类似于SESSID。

Session模块的实现

既然session如此“重要”,我们不妨来看看session模块:
PHP中内置了session方法可供调用,例如session_start以及$_SESSION等。但是原生的Node.js中却没有提供任何session管理的模块,因此我们可以自己实现一个:

根据上面对session和cookie的介绍,我们不难得出其中的逻辑
session生产过程
(其实,服务端检查的是session在浏览器的cookie中有没有对应的session id)

如上图所示,客户端首先会请求Session,而当服务端检查客户端中的Cookie没有相应的Session id时,会通过-一定方式为其生成一个新的Session id, 而如果Cookie中存在该Session id并且没有过期时,则直接返回Session数据。
那么根据如上流程示意图以及介绍,可以为我们需要实现的模块先创建3种方法,分别是start、 newSession和cleanSessions。 start方法主要是启动Session管理,newSession主要是为客户端创建一个新的Session id, 而cleanSessions则是清除Session数据。
本模块应用一个Session数组来存储系统所有的Session, 当有Session id存在时,无需新建Sessionid,而是直接读取返回Session数据;而当Sessionid不存在时,需要创建Session id,并且将Sessionid存储在该客户端的Cookie中。笔者做了一个简单的session校验start,代码如下:

商务通(在线客服系统)
商务通(在线客服系统)

一款无需安装的即时交流系统,只需申请一个帐号,将一段代码嵌入贵站网页中,就可以让客服人员发现所有到达您网站的访客,而且可以看到访客的来源、使用的搜索引擎等,您可以主动发起对话与访客沟通,进行产品推销,从而大大提高产品销售成功率。 还是一款协同管理软件,在保持与客户信息通畅的同时,也保持公司内部之间的信息交流,从而提高企业的工作效率和客户服务质量。 管理员帐号:biiz.cn 密码:biiz.cn

下载
var start = function(req,res){
	var conn = { res: res, req: req };
	var cookies = {};
	
	if(typeof conn.req.headers.cookie !== "undefined"){
		//session存在时,对session进行解析,获取其中的session id
		conn.req.headers.cookie.split(';').forEach(function(cookie){
			var parts=cookie.split('=');
			cookies[ parts[0].trim() ] = (parts[1] || '').trim();
		});
	}else{
		cookies.SESSID = 0;
	}
	
	var SESSID = cookies.SESSID;
	if(typeof sessions[SESSID] !== "undefined"){   //判断服务器中是否存在该session值
		session=sessions[SESSID];
		if(session.expires < Date()){   //如果session过期
			delete sessions[SESSID];
			//session过期或者不存在(下面那个)时,新生成一个session
			return newSession(conn.res);
		}else{
			var dt = new Date();
			dt.setMinutes(dt.getMinutes() + 30);
			
			session.expires = dt;   //重置session过期时间
			return sessions[SESSID];
		}
	}else{
		return newSession(conn.res);
	}
};

以上就是一个session简单的校验过程,主要思路就是通过req对象中的headers获取cookie,并对cookie进行解析获取session id,进而判断是否存在该id值,从而返回或生成新的session。下面我们来看下主要方法newSession的实现:

function newSession(res){
	var chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
	var SESSID = '';
	for(var i = 0; i < 40; i++){
		var rnum = Math.floor(Math.random()*chars.length);
		SESSID += chars.substring(rnum,rnum+1);
	}
	if(typeof sessions[SESSID] !== "undefined"){
		return newSession(res);   //避免重复session
	}
	
	var dt = new Date();
	dt.setMinutes(dt.getMinutes() + 30);
	
	var session = {
		SESSID,
		expires: dt
	};
	sessions[SESSID] = session;
	//为客户端新增cookie数据(在客户端cookie中保存sessid)
	res.setHeader('Set-Cookie','SESSID=' + SESSID);
	return session;
}

当然,最后就是将整个模块暴露出去:

exports.start=start;

Session模块的应用

我们可以在入口文件(例如app.js)中require该模块,并在HTTP的createServer函数中调用session.start,并将session.start返回的对象作为一个全局对象存储,代码如下:

var app=http.createServer(function(req,res){
	global.sessionLib = session.start(res,req);
});
//调用时
if(!sessionLib['username']){
	sessionLib['username'] = 'mxc';
}

node框架express中session插件的应用

介绍完基础模块,拿笔者的一个项目来说下框架中相关插件的基本用法 —— 其实其实现原理与本文所说不差一二。

const cookieSession=require('cookie-session');
(function (){
  var keys=[];
  for(var i=0;i<100000;i++){
    keys[i]='a_'+Math.random();
  }
  server.use(cookieSession({
    name: 'sess_id',
    keys: keys,
    maxAge: 20*60*1000  //20min
  }));
})();

使用时判断:

  //检查登录状态
  router.use((req, res, next)=>{
    if(!req.session['admin_id'] && req.url!='/login'){ //没有登录且当前不是登录页(避免redirect黑洞)
      res.redirect('/admin/login');
    }else{
      next();
    }
  });

登录后:

req.session['admin_id']=data[0].ID;

更多编程相关知识,请访问:编程视频!!

相关专题

更多
云朵浏览器入口合集
云朵浏览器入口合集

本专题整合了云朵浏览器入口合集,阅读专题下面的文章了解更多详细地址。

0

2026.01.20

Java JVM 原理与性能调优实战
Java JVM 原理与性能调优实战

本专题系统讲解 Java 虚拟机(JVM)的核心工作原理与性能调优方法,包括 JVM 内存结构、对象创建与回收流程、垃圾回收器(Serial、CMS、G1、ZGC)对比分析、常见内存泄漏与性能瓶颈排查,以及 JVM 参数调优与监控工具(jstat、jmap、jvisualvm)的实战使用。通过真实案例,帮助学习者掌握 Java 应用在生产环境中的性能分析与优化能力。

20

2026.01.20

PS使用蒙版相关教程
PS使用蒙版相关教程

本专题整合了ps使用蒙版相关教程,阅读专题下面的文章了解更多详细内容。

62

2026.01.19

java用途介绍
java用途介绍

本专题整合了java用途功能相关介绍,阅读专题下面的文章了解更多详细内容。

87

2026.01.19

java输出数组相关教程
java输出数组相关教程

本专题整合了java输出数组相关教程,阅读专题下面的文章了解更多详细内容。

39

2026.01.19

java接口相关教程
java接口相关教程

本专题整合了java接口相关内容,阅读专题下面的文章了解更多详细内容。

10

2026.01.19

xml格式相关教程
xml格式相关教程

本专题整合了xml格式相关教程汇总,阅读专题下面的文章了解更多详细内容。

13

2026.01.19

PHP WebSocket 实时通信开发
PHP WebSocket 实时通信开发

本专题系统讲解 PHP 在实时通信与长连接场景中的应用实践,涵盖 WebSocket 协议原理、服务端连接管理、消息推送机制、心跳检测、断线重连以及与前端的实时交互实现。通过聊天系统、实时通知等案例,帮助开发者掌握 使用 PHP 构建实时通信与推送服务的完整开发流程,适用于即时消息与高互动性应用场景。

19

2026.01.19

微信聊天记录删除恢复导出教程汇总
微信聊天记录删除恢复导出教程汇总

本专题整合了微信聊天记录相关教程大全,阅读专题下面的文章了解更多详细内容。

160

2026.01.18

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Node.js 教程
Node.js 教程

共57课时 | 9万人学习

【web前端】Node.js快速入门
【web前端】Node.js快速入门

共16课时 | 2万人学习

Node.js-前端工程化必学
Node.js-前端工程化必学

共19课时 | 3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号