标签: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