如何在 NodeJS 中维护请求会话

Posted

技术标签:

【中文标题】如何在 NodeJS 中维护请求会话【英文标题】:How to maintain a request session in NodeJS 【发布时间】:2013-11-25 01:06:43 【问题描述】:

我正在尝试使用NodeJS 抓取需要POST 登录的网站。 登录后,我可以通过GET 访问单独的网页。

现在的第一个问题是登录。我尝试使用requestPOST 的登录信息,但我得到的响应似乎没有登录。

exports.getstats = function (req, res) 
    request.post(url : requesturl, form: lform, function(err, response, body) 
        res.writeHeader(200, "Content-Type": "text/html");
        res.write(body);
        res.end();
    );
;

这里我只是转发我返回的页面,但我返回的页面仍然显示登录表单,如果我尝试访问另一个页面,它会说我没有登录。

我认为我需要维护客户端会话和 cookie 数据,但我找不到任何资源来帮助我理解如何做到这一点。


作为后续行动,我最终使用zombiejs 来获得我需要的功能

【问题讨论】:

你能用zombiejs发布你的例子吗?我遇到了同样的问题,node.js 使用请求不保留会话。 【参考方案1】:

Request 管理请求之间的 cookie(如果您启用它):

默认情况下禁用 Cookie(否则,它们将用于 后续请求)。要启用 cookie,请将 jar 设置为 true(在 默认值或选项)。

const request = request.defaults(jar: true)
request('http://www.google.com', function () 
  request('http://images.google.com')
);

【讨论】:

【参考方案2】:

request.jar(); 对我不起作用。所以我正在使用标头响应发出另一个这样的请求:

request.post(
    url: 'https://exampleurl.com/login',
    form: "login":"xxxx", "password":"xxxx"
, function(error, response, body)

    request.get(
        url:"https://exampleurl.com/logged",
        header: response.headers
    ,function(error, response, body)
        // The full html of the authenticated page
        console.log(body);
    );
);

实际上这种方式工作正常。 =D

【讨论】:

很棒的提示。解决了我类似的情况,仅发送 cookie 是不够的。【参考方案3】:

您需要制作一个 cookie jar 并为所有相关请求使用同一个 jar。

 var cookieJar = request.jar();
 request.post(url : requesturl, jar: cookieJar, form: lform, ...

理论上,这应该允许您以登录用户的身份使用 GET 抓取页面,但只有在您让实际登录代码正常工作后。根据您对登录 POST 响应的描述,这实际上可能还不能正常工作,因此 cookie jar 在您首先解决登录代码中的问题之前不会有帮助。

【讨论】:

这很有帮助。我还是按照你说的登录不成功。我无法弄清楚缺少什么。我正在使用 POST 并添加表单数据,但由于某种原因,我连接的 php 服务器永远不会回复“登录”页面。我会继续努力的 是的,这取决于他们的服务器端代码,你基本上是逆向工程。如果他们使用 CSRF 令牌,你确定你正在处理它们吗?他们可能会嗅探用户代理吗?您是否必须先获取 / 才能获取会话 cookie,然后确保登录后的 POST 包含该 cookie?等等。 我为用户代理添加了标题,但我认为他们使用客户端脚本进行登录。在我的一个回复中,我读到了“请启用脚本登录”。我现在卡住了:( 使用 chrome 开发工具直接检查 http 请求并尝试在您的代码中进行模拟。 这就是我迄今为止一直在做的事情,它确实很有用,但我认为登录系统有一些 javascript 恶作剧。我将重新考虑我的方法。

以上是关于如何在 NodeJS 中维护请求会话的主要内容,如果未能解决你的问题,请参考以下文章

在 grails 中维护会话

如何在使用 Python 脚本登录时维护登录会话

Nodejs + Passport.js + Redis:如何在 Redis 中存储会话

NodeJS express - 如何在路由器内添加会话数据?

如何在渲染html页面中检索nodejs会话值?

如何在 Restful WCF 服务中管理会话