本模块应用一个Session数组来存储系统所有的Session, 当有Session id存在时,无需新建Sessionid,而是直接读取返回Session数据;而当Sessionid不存在时,需要创建Session id,并且将Sessionid存储在该客户端的COOKIE中。笔者做了一个简单的session校验start,代码如下:
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以上就是一个session简单的校验过程,主要思路就是通过req对象中的headers获取COOKIE,并对COOKIE进行解析获取session id,进而判断是否存在该id值,从而返回或生成新的session。下面我们来看下主要方法newSession的实现:
function newSession(res){ var chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; var SESSID = &#39;&#39;; 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(&#39;Set-COOKIE&#39;,&#39;SESSID=&#39; + 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[&#39;username&#39;]){ sessionLib[&#39;username&#39;] = &#39;mxc&#39;; }node框架express中session插件的应用
介绍完基础模块,拿笔者的一个项目来说下框架中相关插件的基本用法 —— 其实其实现原理与本文所说不差一二。
const COOKIESession=require(&#39;COOKIE-session&#39;);(function (){ var keys=[]; for(var i=0;i<100000;i++){ keys[i]=&#39;a_&#39;+Math.random(); } server.use(COOKIESession({ name: &#39;sess_id&#39;, keys: keys, maxAge: 20*60*1000 //20min })); })();使用时判断:
//检查登录状态 router.use((req, res, next)=>{ if(!req.session[&#39;admin_id&#39;] && req.url!=&#39;/login&#39;){ //没有登录且当前不是登录页(避免redirect黑洞) res.redirect(&#39;/admin/login&#39;); }else{ next(); } });登录后:
req.session[&#39;admin_id&#39;]=data[0].ID;更多编程相关知识,请访问:编程视频!!
以上就是一起看看nodejs中的COOKIE和session的详细内容,更多请关注其它相关文章!