node.js中结合redis实现session修改完善(2)

代码的设计比较乱,整理了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);
    });
};
时间: 2024-11-10 10:34:02

node.js中结合redis实现session修改完善(2)的相关文章

node.js中结合redis实现session

这里的session机制很简单,用户登录之后,给用户生成一个session,包含用户的唯一编号ID,过期时间expires,以及用户的用户的sessionID. 创建了session之后,将session存放到redis数据库中,现在也只是测试了可以存放数据,并没有进行redis的进一步操作,今后将对redis进行集群操作,虽然小,但是一定要五脏俱全,会写两个类,一个专门用来写,针对主库,然后另一个专门用来读,针对从库. 这需要一个key值与redis从库的连接地址相关联,因为当存在多个key值

Node.js中使用redis数据库的正确姿势

Redis是一个常用的Nosql数据库,一般用来代替Memcached做缓存服务,同时它也支持数据的持久化,有着比较广泛的应用场景.在Java中使用redis我们已经比较熟悉了,那么在node.js和koa.js框架中使用Redis的正确姿势是怎样的呢? Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库. Redis 与其他 key - value 缓存产品有以下三个特点: * Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载

Node.js中的Session,不要觉得简单哦。

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,博客地址为http://www.cnblogs.com/jasonnode/ .学习网站上有对应每一小节的在线练习大家可以去试试. Cookie 在web应用中,多个请求之间共享“用户会话”是非常必要的.但HTTP1.0协议是无状态的.那这时Cookie就出现了.那Cookie又是如何处理的呢? Cookie的处理: 服务端向客户端发送Cookie 客户端的浏览器把Cookie保存 然后在每次

Cookie和Session在Node.JS中的实践(二)

Cookie和Session在Node.JS中的实践(二) cookie篇在作者的上一篇文章Cookie和Session在Node.JS中的实践(一)已经是写得算是比较详细了,有兴趣可以翻看,这篇是session篇,重点在讨论seesion的特性.概念,以及session和cookie的区别和联系. 之前有人问我,这个问题有必要长篇大论的探讨吗?其实只要我觉得这个技术点重要而且具有迷惑性,就值得去写.去探讨,否则你很难完全明白.写这种文章有两个好处: 首先,于作者而言,写出来文章让大家一起理解某

Node.js中的不安全跳转如何防御详解

Node.js中的不安全跳转如何防御详解 导语: 早年在浏览器大战期间,有远见的Chrome认为要运行现代Web应用,浏览器必须有一个性能非常强劲的Java引擎,于是Google自己开发了一个高性能的开源的Java引擎,名字叫V8.在2009年,Ryan正式推出了基于Java语言和V8引擎的开源Web服务器项目,命名为Node.js. 对于任何web开发人员来说,不安全或未经验证的重定向都是重要的安全考虑因素.Express为重定向提供了本地支持,使它们易于实现和使用.Express是一种保持最

在Node.js中使用RabbitMQ系列二 任务队列

在上一篇文章在Node.js中使用RabbitMQ系列一 Hello world我有使用一个任务队列,不过当时的场景是将消息发送给一个消费者,本篇文章我将讨论有多个消费者的场景. 其实,任务队列最核心解决的问题是避免立即处理那些耗时的任务,也就是避免请求-响应的这种同步模式.取而代之的是我们通过调度算法,让这些耗时的任务之后再执行,也就是采用异步的模式.我们需要将一条消息封装成一个任务,并且将它添加到任务队列里面.后台会运行多个工作进程(worker process),通过调度算法,将队列里的任

node.js中的交互式运行环境-REPL

<Node.js权威指南>第2章Node.js中的交互式运行环境--REPL 开发者可以在该环境中很方便地输入各种JavaScript表达式并观察表达式的运行结果. 在学习Node.js框架的过程中,通过该运行环境的使用,我们可以很方便地了解Node.js中定义的各种对象所拥有的各种属性及方法.本节为大家介绍在REPL运行环境中操作变量 2.2 在REPL运行环境中操作变量 在REPL运行环境中,可以使用var关键字来定义一个变量并为其赋值,但是在输入了对其赋值进行的表达式后,该表达式的执行结

log4js-Node.js中的日志管理模块使用与封装

开发过程中,日志记录是必不可少的事情,尤其是生产系统中经常无法调试,因此日志就成了重要的调试信息来源. Node.js,已经有现成的开源日志模块,就是log4js,源码地址:点击打开链接 项目引用方法: npm install log4js 1.配置说明(仅以常用的dateFile日志类型举例,更多说明参考log4js-wiki): { "appenders": [ // 下面一行应该是用于跟express配合输出web请求url日志的 {"type": "

Node.js中REST API使用示例——基于云平台+云服务打造自己的在线翻译工具

做为一个程序员可能在学习技术,了解行业新动态,解决问题时经常需要阅读英文的内容:而像我这样的英文小白就只能借助翻译工具才能理解个大概:不禁经常感慨,英文对学习计算机相关知识太重要了!最近发现IBM的云平台Blumemix,并且提供语言翻译的服务,感觉不错,就拿来研究学习一下:这里就分享一下我的研究学习过程,如何使用Node.js调用REST API打造自己的在线翻译工具,并演示如何把它发布到云平台上,让每个人都可以通过网络访问使用它. 应用效果展示 您可以通过点击效果图片的链接访问它. 构建一个