设为首页 收藏本站
查看: 736|回复: 0

[经验分享] 扩展nodejs简易mvc之cookie与表单认证

[复制链接]

尚未签到

发表于 2017-2-22 12:32:06 | 显示全部楼层 |阅读模式
  前段时间使用nodejs实现了简单的mvc,最近一直在使用nodejs围绕着这个简易的mvc进行扩展,力求使其成为一个完整的mvc框架。在http请求中,由于http是没有状态的,为了让客户端保留一些来自服务端的信息,并且在下一次请求中能传递到服务端,那么我们能使用的手段大致分为两种:1、Cookie;2、胖Url。
  Cookie是绝佳的客户端存储介质,也是实现持久会话的最好方式,Cookie主要分为2种:会话Cookie(用户退出浏览器时,会话Cookie会被删除)和持久Cookie(生存时间更长一些,它们存储与硬盘上,浏览器退出,计算机重启它们仍然存在)。具体关于Cookie的介绍可以参考司徒正美关于Cookie的文章。
  nodejs中添加cookie的应用,我参考了C#的实现方式,在http请求中,Request对象负责管理来自客户端的Cookie而Response对象则应该负责输出服务端新增的Cookie,大致代码如下:

function HttpCookie(cookie) {
this.hashtable = {};
var _this = this;
//分解http请求内的cookie,其格式为 name=value; name=value; ...
cookie && cookie.split(';').forEach(function (c) {
var pair = c.split('=');
_this.hashtable[pair[0].trim()] = [pair[1].trim(), {}];
});
};
HttpCookie.prototype.add = function (name, value, options) {
options || (options = {});
m_has.call(options, 'path') || (options.path = '/');
this.hashtable[name] = [value, options];
};
HttpCookie.prototype.remove = function (name) {
var options = this.hashtable[name] && this.hashtable[name][1] || {};
options[MAX_AGE] = 0;
};
HttpCookie.prototype.toArray = function () {
var cookies = [];
for (var k in this.hashtable) {
var sb = [];
sb.push(m_util.format(FORMAT, k, this.hashtable[k][0]));
var options = this.hashtable[k][1];
for (var op_k in options) {
sb.push(m_util.format(FORMAT, op_k, options[op_k]));
}
cookies.push(sb.join('; '));
}
return cookies;
};
HttpCookie.prototype.get = function (name) {
return this.hashtable[name] && this.hashtable[name][0] || '';
};

  有了Cookie的支持,那么就可以利用Cookie来存储用户登录后需要存储的一些用户数据了,类似于C#中的Request.User对象,大致流程如下:
DSC0000.png

  按照流程,需要修改requestHandler.js在用户访问首页的时候,应该去判断客户端是否存在存放SessionID的Cookie,如果不存在的话,则添加相应的Cookie,那么在下一次用户登录请求中,就有了对需要存储的用户数据加密的key了,大致代码如下:

//requestHandler.js
if (route.action) {
//省略了其他代码
if (controller[route.action]) {
try {
req.cookie = new HttpCookie(req.headers.cookie);
res.cookie = new HttpCookie();
//这里的key为了简便,设置了123456                                                
req.cookie.get(m_config.SESSION) || res.cookie.add(m_config.SESSION, '123456');
//省略了其他代码
}
catch (e) {
m_invalidHandler.handle500(req, res);
}
}
else {
m_invalidHandler.handle404(req, res);
}
}
//controllerBase.js
this.res.writeHead(200, {
'Set-Cookie': this.res.cookie.toArray(),
'Content-Type': m_config.CONTENT_TYPE[contentType]
});
this.res.end(content);

  重新启动服务,然后访问地址后,会发现生成了sessionId的cookie,如图:
DSC0001.png

  有了sessionID后,接下来就可以对登录的用户信息进行加密,然后再存入cookie中,相关的代码大致如下:

var plaintext = JSON.stringify(data);
var cryped = '';
var cipher = m_crypto.createCipher('blowfish', this.req.cookie.get(m_config.SESSION));
cryped += cipher.update(plaintext, 'utf8', 'hex');
cryped += cipher.final('hex');
this.res.cookie.add(m_config.AUTH, cryped);                                            

  这里使用的crypto的cipher和deciper进行加密和解密,如果对于crypto不了解的,可以查看nodejs关于crypto的相关api,至于加密算法可以通过getCiphers()来查看。
  输入用户名并登录后,查看cookie会发现生成加密的cookie,如下图:
DSC0002.png

  至于解密的代码我就不贴出来了,相对于加密过程而言,解密就是倒着来的。
  那么今天的内容就到这里了,感谢各位,如有错误请指出,谢谢! 源代码在此

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-345770-1-1.html 上篇帖子: MemCache在win7上的可视化配置以及Nodejs/Net应用 下篇帖子: Nodejs之MEAN栈开发(三)---- 使用Mongoose创建模型及API
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表