node.js中结合redis实现session修改完善(2)
来源:互联网 发布:手机java游戏模拟器 编辑:程序博客网 时间:2024/04/25 12:01
代码的设计比较乱,整理了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 }); };
太多没必要的东西了,最让我不舒服的是我在redis中存储了username, 修改如下:
修改单条数据的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': "用户名或者密码错误"}); } }); }); };
登录这一块就到这里了:下面是修改过之后的session
/** * * @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); });};
2 1
- node.js中结合redis实现session修改完善(2)
- node.js中结合redis实现session
- node.js学习笔记(3)-node.js结合mysql数据库实现的web项目中常见功能--登录验证、session传值、拦截器、ajax传值等
- Node.js Redis Expess 开发环境配置及Session实现服务器间共享实例
- node.js开发中使用Node Supervisor实现监测文件修改并自动重启
- node.js开发中使用Node Supervisor实现监测文件修改并自动重启应用
- node.js 与 redis 与 express 和session协同工作
- node.js结合mongodb
- node.js结合mongodb
- 在 Node.js 应用中集成 Redis
- shiro源码分析篇5:结合redis实现session跨域
- node.js开发中使用Node Supervisor实现监测文件修改并自动重启应用_node.js
- node.js - session
- JS-WORD完善结合之模板化
- 对于node.js开发指南中博客案例的修改实现(一)--开发环境搭建
- 对于node.js开发指南中博客案例的修改实现(二)--代码
- node.js与redis
- node.js redis
- maven中pom文件”missing artifact“ 的解决办法
- 浅谈应用工厂模式和单例在Android中实现业务隔离
- Scala学习笔记(一)
- js 正则表达式 ,除去字符串中 font-family:xxxx 这样的字符传
- WinHTTP中的认证问题
- node.js中结合redis实现session修改完善(2)
- Leetcode: Word Search
- 左联(left join) 右联(right join) 内联(inner join) 查询
- ActionBarActivity
- Scala学习笔记(二) - 环境配置
- Java Servlet完全教程
- IEEE802.11协议基础知识
- IMP-00002: 无法打开 D:\orcldat\test_20111024.dmp 进行读取,rman备份
- Scala学习笔记(三) - 基础类型