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
原创粉丝点击