node模拟http服务器session机制-我们到底能走多远系列(36)
我们到底能走多远系列(36)
扯淡:
年关将至,总是会在一些时间节点上才感觉时光飞逝,在平时浑浑噩噩的岁月里都浪费掉了太多的宝贵。请珍惜!
主题:
HttpSession session = request. getSession();
session.setAttribute ("uid", 1) ;
session.getAttribute ("uid") ;
// 获得客户端的Cookie
var Cookies = {};
req.headers.cookie && req.headers.cookie.split(';').forEach(function( Cookie ) {
var parts = Cookie.split('=');
Cookies[ parts[ 0 ].trim() ] = ( parts[ 1 ] || '' ).trim();
});
console.info(Cookies); // 设置cookie
res.setHeader(
'Set-Cookie', 'myCookie=test'
);

var Session = require('./Session');
var SessionsManage = function(expires, clean_time ){
this.def_expires = expires||100; // 过期时间
this.def_clean_time = clean_time||1000; // 执行清除操作间隔时间
this.sessions = {}; // session 放置处
//启动定时任务,就是说不停的会检查去除sessions中过期的的session
setInterval(this.cleanup, this.def_clean_time, this.sessions);
};
var init = function(expires, clean_time){
return new SessionsManage(expires, clean_time);
};
module.exports = SessionsManage;
/**
* 模拟取session
* @param req
* @param name
* @returns {null, session}
*/
SessionsManage.prototype.getSession = function(req, name){
var id = getIdFromCookies(req);
if(id){
// 现货器session对象
var session = this.sessions[id];
if(session && session[name]){
// 再从session对象中找对应的值
return session[name];
}else {
return null;
}
}else{
return null;
}
};
/**
* 模拟存session
* @param req
* @param res
* @param opts
* @returns {boolean}
*/
SessionsManage.prototype.setSession = function(req, res, opts){
if(!opts){
return false;
}else{
// 从cookie中获取id
var id = getIdFromCookies(req) || randomString(36);
var name = opts.name;
var value = opts.value;
var expires = opts.expires || this.def_expires;
if(id && value && name){
// 新创一个session
var session = new Session();
session[name] = value;
session["id"] = id;
session["overLifeTime"] = (+new Date) + expires*1000;
// 放置进sessions
this.sessions[id] = session;
// 写入返回客户端的cookie中
this.setCookieId(res, id, expires);
}
}
};
SessionsManage.prototype.setCookieId = function(res, id, expires){
// config cookie
var d = new Date();
d.setTime(d.getTime() + expires*1000); // in milliseconds
res.setHeader(
'Set-Cookie', 'D_SID='+ id +';expires='+d.toGMTString()+';'
);
};
SessionsManage.prototype.cleanup = function(sessions){
var now = new Date().getTime();
for(var id in sessions){
var session = sessions[id];
if(session.overLifeTime < now){
delete sessions[session.id];
}
}
};
var getIdFromCookies = function(req){
// client's Cookie
var Cookies = {};
req.headers.cookie && req.headers.cookie.split(';').forEach(function( Cookie ) {
var parts = Cookie.split('=');
Cookies[ parts[ 0 ].trim() ] = ( parts[ 1 ] || '' ).trim();
});
console.info(Cookies);
console.info(Cookies["D_SID"]);
if(Cookies["D_SID"]){
return Cookies["D_SID"];
}else{
return null;
}
};
function randomString(bits){
return new Date().getTime();
}
var Session = function(opt){
if(opt){
this.id = opt.id;
this.overLifeTime = opt.expires;
}
};
module.exports = Session;
// 正则匹配全部请求
app.get(/^\/*/,function(req, res, next){
if(req.path == "/upload" || req.path == "/doupload"){
var user = SessionsManage.getSession(req,"user");
if(!user){
res.render('login', {});
return;
}
}
next();
});
exports.dologin = function(db, sessions){
return function(req, res) {
console.log("dologin");
var username = req.body.username;
var password = req.body.password;
console.log("username:" + username + "password:" + password);
var collection = db.get('usercollection');
collection.find({},{'username':username,'password':password},function(e,docs){
if(docs){
console.log("username and password is valid");
var opts = {
name : "user",
value : username,
expires : 500
};
// 调用了setSession
sessions.setSession(req,res,opts);
res.render('upload', {});
}else{
console.log("username and password is invalid");
}
});
};
};
让我们继续前行
----------------------------------------------------------------------
努力不一定成功,但不努力肯定不会成功。
node模拟http服务器session机制-我们到底能走多远系列(36)的更多相关文章
- node实现http上传文件进度条 -我们到底能走多远系列(37)
我们到底能走多远系列(37) 扯淡: 又到了一年一度的跳槽季,相信你一定准备好了,每每跳槽,总有好多的路让你选,我们的未来也正是这一个个选择机会组合起来的结果,所以尽可能的找出自己想要的是什么再做决定 ...
- ThreadPoolExecutor机制探索-我们到底能走多远系列(41)
我们到底能走多远系列(41) 扯淡: 这一年过的不匆忙,也颇多感受,成长的路上难免弯路,这个世界上没人关心你有没有变强,只有自己时刻提醒自己,不要忘记最初出发的原因. 其实这个世界上比我们聪明的人无数 ...
- js中this和回调方法循环-我们到底能走多远系列(35)
我们到底能走多远系列(35) 扯淡: 13年最后一个月了,你们在13年初的计划实现了吗?还来得及吗? 请加油~ 主题: 最近一直在写js,遇到了几个问题,可能初入门的时候都会遇到吧,总结下. 例子: ...
- Spring mvc源码url路由-我们到底能走多远系列(38)
我们到底能走多远系列38 扯淡: 马航的事,挺震惊的.还是多多珍惜身边的人吧. 主题: Spring mvc 作为表现层的框架,整个流程是比较好理解的,毕竟我们做web开发的,最早也经常接触的就是一个 ...
- 服务调用方案(Spring Http Invoker) - 我们到底能走多远系列(40)
我们到底能走多远系列(40) 扯淡: 判断是否加可以效力于这家公司,一个很好的判断是,接触下这公司工作几年的员工,了解下生活工作状态,这就是你几年后的状态,如果满意就可以考虑加入了. 主题: 场景: ...
- Sharded实现学习-我们到底能走多远系列(32)
我们到底能走多远系列(32) 扯淡: 工作是容易的赚钱是困难的 恋爱是容易的成家是困难的 相爱是容易的相处是困难的 决定是容易的可是等待是困难的 主题: 1,Sharded的实现 Sharded ...
- JMS生产者+单线程发送-我们到底能走多远系列(29)
我们到底能走多远系列(29) 扯淡: “然后我俩各自一端/望着大河弯弯/终于敢放胆/嘻皮笑脸/面对/人生的难” --- <山丘> “迎着风/迎向远方的天空/路上也有艰难/也有那解 ...
- ArrayBlockingQueue-我们到底能走多远系列(42)
我们到底能走多远系列(42) 扯淡: 乘着有空,读些juc的源码学习下.后续把juc大致走一边,反正以后肯定要再来. 主题: BlockingQueue 是什么 A java.util.Queue t ...
- 初始化IoC容器(Spring源码阅读)-我们到底能走多远系列(31)
我们到底能走多远系列(31) 扯淡: 有个问题一直想问:各位你们的工资剩下来会怎么处理?已婚的,我知道工资永远都是不够的.未婚的你们,你们是怎么分配工资的? 毕竟,对自己的收入的分配差不多体现了自己的 ...
随机推荐
- eclipse 连接 mysql
1.下载驱动. 2.eclipse->add extend jars -> 添加驱动. 3.测试: 在mysql 建立数据库和表,在eclipse 里对数据库进行操作. 代码: mysql ...
- js 日期时间控制器
/////////////////////////调用实例 // <div> // <span>交易查询:</span> <span>从 // < ...
- qt--- vs
qt with vs 1.安装vs2012: 2.下载Qt 5.2.0 for Windows 32-bit (VS 2012, 579 MB) 和 Visual Studio Add-in 1.2. ...
- GL10控制图形旋转
GL10提供了glRotatef(float angle , float x , float y , float z)方法,该方法用于控制旋转,该方法种angle控制旋转角度:而x.y.z参 ...
- 告别硬编码-发个获取未导出函数地址的Dll及源码
还在为找内核未导出函数地址而苦恼嘛? 还在为硬编码通用性差而不爽吗? 还在为暴搜内核老蓝屏而痛苦吗? 请看这里: 最近老要用到内核未导出的函数及一些结构,不想再找特征码了,准备到网上找点符号文件解析的 ...
- 《剑指offer-名企面试官精讲典型编程题》读后感
首先,不得不说这是一本好书!!! 我接触这本书是在学长的推荐下去看的,而且口碑还是挺好的一本书,豆瓣的评分也比较高,当我刚看了它,我就深深的爱上了这本书,到现在为止,我已经看了三遍这本书了,平时无聊时 ...
- Centos 6 安装 epel yum库
1.获得epel库安装rpm包 wget https://dl.fedoraproject.org/pub/epel/epel-release-latest-6.noarch.rpm 2.安装获得的r ...
- php的数据访问
方法一:过去时方法 $定义一个变量 = $mysql_connect("要连接的服务器,默认是 localhost","登录所使用的用户名,默认是 root", ...
- poj1125(Floyd最短路)
//Accepted 164 KB 0 ms //floyd #include <cstdio> #include <cstring> #include <iostrea ...
- struts2DMI(动态方法调用)
DMI(Dynamic Method Invoke)即动态,是strus2的一个特性,我们知道,在最开始学习strus2时,往往一个action中只有一个excute方法,比如说add,delete, ...