利用Node.js实现模拟Session验证的登陆
1.身份验证和用户登陆
在一般的Web应用上,假设要实现用户登陆,最经常使用,也是最简单的方法就是使用Session,主要的思路是在Session中保留一些用户身份信息,然后每次在Session中取,假设信息不对或不存在,那么身份验证失败,正确则成功。
Session和Cookie是两个非常相似的东西,都是字符串,仅仅只是Session是保存在server上的,而Cookie是保存在本地的,所以Cookie是不能用作身份验证的。Session故名思议,肯定和client与server间建立的会话相关,Session的工作过程也是如此,每当client和server上的一个网站建立了会话后,就会生成Session在server上,仅仅只是Session里有没有相关的信息,就要看用户的提交操作了。
Session的区分是依照server给的SessionID来进行的,不同种类的serverSessionID不同,下面列举几种SessionID:
①使用ASP.NET的IISserver:ASP.NET_SessionId
②使用Java的Tomcatserver:JSESSIONID
利用Session进行的身份验证过程:
开启了Session支持的server在client開始会话的时候,生成一个SessionID,而且在响应(Response)头(Headers)中的Set-Cookie字段设置一个Cookie,Cookie的内容就是SessionID和Cookie的路径(path),在后继的会话中,client浏览器会自己主动附上Set-Cookie中的SessionID以向server表明身份,server依据SessionID在自己的存储中查找相关用户信息,并完毕验证过程。
那么用户登陆的过程也就是用户对server提交username、password等信息,获取SessionID的过程。
2.怎样模拟实现用户登陆
3.Node.js中的详细实现
我在Node.js中使用了request包来简化请求操作,当然,用原生的http包也是没有问题的,为了开发效率,还是採用一些npm包为好,话不多说,先上代码
request(
{
url: 'http://222.24.3.7:8080/opac_two/include/login_app.jsp', //请求的URL
method: 'POST', //POST方式请求
encoding: null, //因为Node默认是UTF-8,而图书馆用的GB2312,所以不进行转码
headers: { //请求头的设置
ContentType: 'application/x-www-form-urlencoded'
},
form: { //请求体,參数
login_type: 'barcode',
barcode: username, //提交用户名
password: password, //提交密码
_: '' //其它參数
}
},
function (err, res, body) { //接收回调
body = iconv.decode(body, "GB2312"); //转码
//console.log(body);
session = res.headers['set-cookie']; //获取set-cookie字段值
//console.log(session);
if (body == 'ok') {
callback({Result: true, Session: session});
}
else {
callback(false); //回调
}
}
);
上面的代码是一个用户登陆的请求演示样例,採用了URL转码的參数提交方式,提交username与password给server,server是西邮图书馆的借阅信息查询网站。当中3~15行为请求的构建,包括请求头、请求体(參数),详细的写法请參见request的官方文档。
后面的回调函数用于接收server回传的响应,当中就有我们须要的SessionID。
接着,我们来看怎样带上SessionID进行后继的请求
request
(
{
uri: 'http://222.24.3.7:8080/opac_two/reader/jieshulishi.jsp', //构建请求
encoding: null, //不转码
headers: {
Cookie: session //这里是关键,设置Cookie为之前请求到的以Cookie形式呈现的SessionID
}
}, function (err, res, body) { //获取响应就可以
if (err) {
callback('Server Error');
}
}
);
上面代码中,最关键的就是6~8行中,对请求头的设置,也是对Cookie的设置,这里必须设置为传递username及password进行登陆后返回的内容为SessionID的Cookie,不管是什么站点,仅仅要採用Session进行身份验证,就能够使用这样的方式从程序中,模拟用户数据的提交,从而获取须要身份验证页面的信息。
利用Node.js实现模拟Session验证的登陆的更多相关文章
- 利用Node.js对某智能家居服务器重构
原文摘自我的前端博客,欢迎大家来访问 http://www.hacke2.cn 之前负责过一个智能家居项目的开发,外包重庆一家公司的,我们主要开发服务器监控和集群版管理. 移动端和机顶盒的远程通信是用 ...
- 【Node.js】利用node.js搭建服务器并访问静态网页
node.js是一门服务端的语言,下面讲讲如何利用node.js提供给我们的api来搭建服务器,并且访问静态网页 项目结构如下 ------------------------------------ ...
- 如何更好的利用Node.js的性能极限
通过使用非阻塞.事件驱动的I/O操作,Node.js为构建和运行大规模网络应用及服务提供了很好的平台,也受到了广泛的欢迎.其主要特性表现为能够处理庞大的并且高吞吐量的并发连接,从而构建高性能.高扩展性 ...
- 利用Node.js对某智能家居server重构
原文摘自我的前端博客,欢迎大家来訪问 http://www.hacke2.cn 之前负责过一个智能家居项目的开发,外包重庆一家公司的.我们主要开发server监控和集群版管理. 移动端和机顶盒的远程通 ...
- 过滤器+用session验证是否登陆过
过滤器: public class MyActionFilter : ActionFilterAttribute//继承ActionFilterAttribute类 { public override ...
- 教你利用Node.js漏洞搞事情
PentestingNode.js Application : Nodejs Application Security 原文地址:http://www.websecgeeks.com/2017/04/ ...
- 学信网改绑手机号码,但是忘记了老号码怎么办?利用node.js + puppeteer 跑脚本实现改绑手机号
最近登录学信网发现自己学信网上绑定的手机号码不是目前自己使用的手机号码,于是想改绑手机号,但是发现不记得之前的手机号码了: 于是百度各种方法都无济于事:也不想重新注册账号,最后看见一篇文章通过Pyth ...
- Node.js中的Session,不要觉得简单哦。
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,博客地址为http://www.cnblogs.com/jasonnode/ .学习网站上有对应 ...
- 利用Node.js的Net模块实现一个命令行多人聊天室
1.net模块基本API 要使用Node.js的net模块实现一个命令行聊天室,就必须先了解NET模块的API使用.NET模块API分为两大类:Server和Socket类.工厂方法. Server类 ...
随机推荐
- 数学之路-python计算实战(14)-机器视觉-图像增强(直方图均衡化)
我们来看一个灰度图像,让表示灰度出现的次数,这样图像中灰度为 的像素的出现概率是 是图像中全部的灰度数, 是图像中全部的像素数, 实际上是图像的直方图,归一化到 . 把 作为相应于 的累计概率 ...
- EF的两种延迟加载
EF的两种延迟加载 EF的延迟加载一: 在一次查询以后得到temp,然后在temp上直接进行查询得到temp2,我们调用temp2的时候,是直接为temp生成sql脚本的,没有生成temp的脚本,也就 ...
- 学习笔记(10) : Socket 编程典型代码积累
网络编程实现的机制: 服务器端: 申请一个socket 绑定到一个IP地址和端口上 开启侦听,等待接受连接 客户端: 申请一个socket 连接服务器(指明IP.端口) 服务器端: 接收到 ...
- WebBrowser与IE的关系,如何设置WebBrowser工作在IE9模式下?
原文 WebBrowser与IE的关系,如何设置WebBrowser工作在IE9模式下? 一.问题的提出 偶然发现,Winform里的WebBrowser和IE实际安装的版本似乎并不同步,很有趣! 下 ...
- Ajax Post提交事例及SpringMVC注解@RequestMapping取不到参数值解决办法
var xmlHttp; //定义变量,用来创建xmlHttp对象 function ajaxfunction(url,onreadystatechangMethod,param){ // 创建xml ...
- dump json 显示中文问题
[root@dr-mysql01 ~]# cat a2.pl my $url="http://192.168.32.101:3000/api/getcode?env=zj&phone ...
- 怎样制作一个相似Tiny Wings的游戏 Cocos2d-x 2.1.4
在第一篇<怎样使用CCRenderTexture创建动态纹理>基础上,添加�创建动态山丘,原文<How To Create A Game Like Tiny Wings with C ...
- 编译mapnik(win7 环境下vs2008编译mapnik 0.7.1 成功)
编译mapnik(win7 环境下vs2008编译mapnik 0.7.1 成功) ------by wangsh 2012.02.22 Mapnik 是一个开源的 Python/C++ 地图渲染引 ...
- 将258.369 double值转为内存表示(科学计数法)
前言 庖丁解牛 - <<庄子>> 庖丁为文惠君解牛,手之所触, 肩之所倚, 足之所履, 膝之所踦, 砉然向然, 奏刀騞然, 莫不中音, 合于<桑林>之舞, 乃中&l ...
- perl 登陆电信猫
登陆电信猫: use LWP::UserAgent; use HTTP::Date qw(time2iso str2time time2iso time2isoz); use Net::Ping; u ...