标签:node.js session redis mongodb cookie
代码的设计比较乱,整理了jade模板之后,决定链接登录注册功能,但发现很多的实现都太凑合了,先修改了httpParam的get, post, cookie 方法。现在决定修改Session,因为session太无厘头了。
1. 结合的比较混乱
2. session和redis操作在一起,没有独立出去
3. session中存放的数据不明朗
4. session中设置了过期,其实没有必要,因为在redis中已经设置了过期时间
5. 页面切换的时候,没有对session过期时间进行更新
下面即之前的实现:
/** * @description 为用户创建一个session * @param {objetc} res * @param {string} id session在服务器端的标志 * @returns {newSession.session} */ function newSession(res,serverid) { var chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghigklmnopqrstuvwxyz"; var SESSID = ''; for (var i = 0; i < 40; i++) { var num = Math.floor(Math.random() * chars.length); //获取0-39之间的一个数 SESSID += chars.substring(num, num + 1); } lib.redis.exist(SESSID, function (existflg) { if (existflg) { SESSID = new newSession(res); } var dt = new Date(); dt.setMinutes(dt.getMinutes() + 30); var session = { SESSID: SESSID, expires: dt }; sessions[SESSID] = session; saveSession(sessions[SESSID], serverid); res.setHeader('Set-Cookie', 'SESSID=' + SESSID); res.render('home.jade', {'username': serverid}); }); }; function cleanSession() { for (sess in sessions) { if (sess.expires < Date()) { delete sessions[sess.SESSID]; } } } /** * * @param {sessions} newSession创建的对象 * @param {type} 服务器标志用户的id * @returns {undefined} */ function saveSession(session, id) { session.id = id; lib.redis.hmset("SESSID", { "SESSID":session.SESSID, "expires":session.expires, "username":session.id }); };
修改单条数据的mobgodb读取,这里一直是undefined,不说废话了,主要是搞混了shell调用findOne,程序中findOne是通过回调函数来获取结果的。修改下:
/** * 查找单条数据 * 并不通过系统的mongodb进行查找 * change: use findOne to replace find method; */ this.findOneByID = function (tableName, whereJson, callback) { connection(function (mdbConn) { mdbConn.collection(tableName, function (err, collection) { if (err) { return; } collection.findOne(whereJson, function (err, item) { if (item) { console.log(item); callback(item); } else { callback(false); } }); }); }); };
还有下面的情况是,资源文件的路径变了,比如下面的例子,我调用index.jade文件,此时加载css的路径变成了login/index.css,之前加载的路径是index.css,该文件现在是在login文件中处理的。具体为什么这么不合理,还不知道原因。
临时解决一下吧,修改路由:将/之前的统统截取掉,嘻嘻。
var part = requirepath.split('/'); realPath += part.pop();
this.login = function () { lib.httpParam.POST(req, function (value) { value.password = digist.tcrypto(value.password); UserModuleRead.checkUser(value, function (result) { if (result !== false) { lib.session.setSession(res, req, result._id, function (session){ res.setHeader('Set-Cookie', 'SESSID=' + session.SESSID); res.render('index.jade', {'username': result.username}); }); } else{ res.render('login.jade', {'error': "用户名或者密码错误"}); } }); }); };
/** * * @type @exp;session * @description 用户登录之后,设置用户的session */ var httpParam = require('./httpParam.js'); var sessions = {}; /** * @description 获取用户header.cookie头中的session信息 * @param {type} res * @param {type} req * @returns {boolean} 失败返回false,成功返回当前的cookie中的SessionID */ var getCookieSession = function (res, req) { var cookie = httpParam.COOKIE(req, 'SESSIONID'); if (cookie) { var SessionID = cookie; return SessionID; } return false; }; /* * * @param {type} sessionId "fetch a session from redis" * @returns {false | session} */ var getSession = function (sessionId, callback) { lib.redis.exist(sessionId, function (ret) { if (ret) { var session = lib.hgetall(sessionId); callback(session); } callback(false); }); }; /** * @description 获取当前session的状态信息,记录获取登录到网站的用户id * @param {type} res * @param {type} req * @returns {newSession.session|sessions|session} */ exports.sessionStatus = function (res, req) { var sessionID = getCookieSession(res, req); lib.redis.exist(sessionID, function (existflg) { if (existflg) { var sessionJson = lib.redis.hgetall(sessionID); if (sessionJson.expires < Date()) { lib.redis.del(sessionID); global.userId = 0; } else { var dt = new Date(); dt.setMinutes(dt.getMinutes + 30); sessionJson.expires = dt; lib.redis.hset(sesionID, sessionJson); global.userId = sessionJson.userId } } }); } /** * @description 当用户登录 or register 时,设置用户的session信息 * @param {type} res * @param {type} req * @returns {newSession.session|sessions|session} */ exports.setSession = function (res, req, userid, callback) { newSession(res, userid, function (session) { saveSession(session, function (session) { callback(session); }); }); }; /** * @description 为用户创建一个session * @param {objetc} res * @param {string} id session在服务器端的标志 * @returns {json} */ function newSession(res, userId, callback) { var chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghigklmnopqrstuvwxyz"; var SESSID = ''; for (var i = 0; i < 40; i++) { var num = Math.floor(Math.random() * chars.length); //获取0-39之间的一个数 SESSID += chars.substring(num, num + 1); } lib.redis.exist(SESSID, function (existflg) { if (existflg) { SESSID = new newSession(res, userId); } var dt = new Date(); dt.setMinutes(dt.getMinutes() + 30); var session = { SESSID: SESSID, expires: dt, userId: userId }; callback(session); }); } ; function delSession(sessionId) { lib.redis.exist(sessionId, function (ret) { if (ret) { lib.redis.del(sessionId); } }); } /** * save the session to redis * @param {sessions} newSession创建的对象 * @param {type} 服务器标志用户的id * @returns {undefined} */ function saveSession(session, callback) { lib.redis.hmset(session.SESSID, { "expires": session.expires, "userId": session.userId }); callback(session); } ; /* * if user has logined */ exports.isLogin = function (res, req, callback) { //if SESSID in cookie existed var sessionId = getCookieSession(res, req); if (sessionId === false) { return false; } lib.redis.exist(sessionId, function (ret) { if (ret) { callback(sessionId); } callback(false); }); };
node.js中结合redis实现session修改完善(2)
标签:node.js session redis mongodb cookie
原文地址:http://blog.csdn.net/whynottrythis/article/details/45641011