利用Node.js实现模拟Session验证的登陆

1.身份验证和用户登陆

在一般的Web应用上,如果要实现用户登陆,最常用,也是最简单的方法就是使用Session,基本的思路是在Session中保留一些用户身份信息,然后每次在Session中取,如果信息不正确或不存在,那么身份验证失败,正确则成功。

Session和Cookie是两个很相似的东西,都是字符串,只不过Session是保存在服务器上的,而Cookie是保存在本地的,所以Cookie是不能用作身份验证的。Session故名思议,肯定和客户端与服务器间建立的会话相关,Session的工作过程也是如此,每当客户端和服务器上的一个站点建立了会话后,就会生成Session在服务器上,只不过Session里有没有相关的信息,就要看用户的提交操作了。

Session的区分是按照服务器给的SessionID来进行的,不同种类的服务器SessionID不同,以下列举几种SessionID:

①使用ASP.NET的IIS服务器:ASP.NET_SessionId

②使用Java的Tomcat服务器:JSESSIONID

利用Session进行的身份验证过程:

开启了Session支持的服务器在客户端开始会话的时候,生成一个SessionID,并且在响应(Response)头(Headers)中的Set-Cookie字段设置一个Cookie,Cookie的内容就是SessionID和Cookie的路径(path),在后继的会话中,客户端浏览器会自动附上Set-Cookie中的SessionID以向服务器表明身份,服务器根据SessionID在自己的存储中查找相关用户信息,并完成验证过程。

那么用户登陆的过程也就是用户对服务器提交用户名、密码等信息,获取SessionID的过程。

2.如何模拟实现用户登陆

模拟用户登陆,不是为了进行暴力破解,而是为了越过某些网站的身份验证,然后获取所需信息,就比如说学校的图书馆,如果在程序中想要获取读者的借阅信息,因为程序不会像浏览器那样自动带上SessionID,那么就必须将用户名和密码提交至服务器,获得到SessionID以后,对后继的请求带着SessionID去请求其他页面,才能获取到借阅信息,大致流程如下:

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转码的参数提交方式,提交用户名和密码给服务器,服务器是西邮图书馆的借阅信息查询站点。其中3~15行为请求的构建,包含请求头、请求体(参数),具体的写法请参见request的官方文档。

后面的回调函数用于接收服务器回传的响应,其中就有我们需要的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的设置,这里必须设置为传递用户名及密码进行登陆后返回的内容为SessionID的Cookie,无论是什么网站,只要采用Session进行身份验证,就可以使用这种方式从程序中,模拟用户数据的提交,从而获取需要身份验证页面的信息。

我们只要在响应中对body的内容进行分析,即可抓取HTML中的信息,Node.js真是方便!

转载请注明出处,http://blog.csdn.net/yuanguozhengjust/article/details/37601757

利用Node.js实现模拟Session验证的登陆,布布扣,bubuko.com

时间: 2024-12-03 22:36:58

利用Node.js实现模拟Session验证的登陆的相关文章

利用node js快速模拟Web API

Web API即使通过网络进行调用的API接口,与具体的编程语言无关.现在常见的是通过标准的HTTP GET/POST请求,从服务器获取响应的资源或服务,服务器返回调用的结果内容,一般为xml格式或者json格式的数据(现在使用json的更多). 在开发App的时候,一般原型设计好(如使用just in mind之类的工具)之后,我们会设计出与服务器交互的接口文档.一般情况下,App的开发进度(尤其原型)要快于服务器的开发进度.在App静态原型开发完到服务器实现所有的交互接口这段期间内,我们当然

利用Node.js对某智能家居服务器重构

原文摘自我的前端博客,欢迎大家来访问 http://www.hacke2.cn 之前负责过一个智能家居项目的开发,外包重庆一家公司的,我们主要开发服务器监控和集群版管理. 移动端和机顶盒的远程通信是用中间服务器完成交互,服务器使用MINA NIO框架,非阻塞式的,可以看看以前博客了解下某智能家居项目框架学习总结,或者其他资料JAVA NIO原理,基于MINA框架快速开发网络应用程序. 在移动端或者机顶盒登录后会使用spring security 进行加密,主要是结合用户名和密码来加密,生成一个唯

如何更好的利用Node.js的性能极限

通过使用非阻塞.事件驱动的I/O操作,Node.js为构建和运行大规模网络应用及服务提供了很好的平台,也受到了广泛的欢迎.其主要特性表现为能够处理庞大的并且高吞吐量的并发连接,从而构建高性能.高扩展性的互联网应用.然而,Node.js单线程的的工作方式及有限的可管理内存使得其计算性能十分有限,限制了某些场景中的应用.近日,Jut开发团队的工程师Dave Galbraith分享了他们所遇到的Node.js的限制以及超越这些限制的方法.接下来,本文就详细分析其所遇到的问题及解决思路. 首先,Jut团

过滤器+用session验证是否登陆过

过滤器: public class MyActionFilter : ActionFilterAttribute//继承ActionFilterAttribute类 { public override void OnActionExecuting(ActionExecutingContext filterContext) { //用session验证是否登陆过 if(filterContext.HttpContext.Session["visitor_name"] == null) {

利用node.js搭建简单web服务器的方法教程

前言 使用Nodejs搭建Web服务器是学习Node.js比较全面的入门教程,因为要完成一个简单的Web服务器,你需要学习Nodejs中几个比较重要的模块,比如:http协议模块.文件系统.url解析模块.路径解析模块.以及301重定向问题,下面我们就简单讲一下如何来搭建一个简单的Web服务器. 早先不使用web服务器的情况下想要在浏览器端访问本地资源,可以利用firefox浏览器,其可以自己启动一个小型web服务器. 为了让刚接触node的人也能大体看懂,本文的代码我将尽量简化. 准备 首先,

Node.js中的Session,不要觉得简单哦。

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,博客地址为http://www.cnblogs.com/jasonnode/ .学习网站上有对应每一小节的在线练习大家可以去试试. Cookie 在web应用中,多个请求之间共享“用户会话”是非常必要的.但HTTP1.0协议是无状态的.那这时Cookie就出现了.那Cookie又是如何处理的呢? Cookie的处理: 服务端向客户端发送Cookie 客户端的浏览器把Cookie保存 然后在每次

利用node.js写一个后台服务器---express框架的搭建及使用

一.node.js+express框架的服务项目搭建 step1:创建一个项目目录:myApp step2:命令行进入该目录,执行: npm init 在命令执行过程中,会让你设置一个项目的入口文件(entry point),可以随意设置例如:index.js. 执行完毕后,会在项目中创建一个package.json的文件,这个文件就是用来管理项目中今后需要安装的一些模块或依赖. step3:安装express插件: npm install express --save step4:expres

利用node js 来创建一个服务器 升级版

1.为项目准备一个文件夹 2.在根目录下 创建server.js 文件 3.文件代码如下 var http = require("http"); http.createServer(function(request,response){ response.writeHead(200,{'Content-Type':'text/plain'}); response.end("Hello World\n")}).listen(8080); console.log(&qu

[转]Browserify —— 利用Node.js实现JS模块化加载

原文地址:http://www.oschina.net/p/browserify Browserify 可以让你使用类似于 node 的 require() 的方式来组织浏览器端的 Javascript 代码,通过预编译让前端 Javascript 可以直接使用 Node NPM 安装的一些库. 安装: npm install -g browserify    示例 这是 main.js 的内容,像普通的 nodejs 程序那样使用 require() 加载库和文件: var foo = req