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);
    });
};


郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。