【问题标题】:How to maintain a request session in NodeJS如何在 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 使用请求不保留会话。

标签: javascript node.js session request


【解决方案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 恶作剧。我将重新考虑我的方法。
    猜你喜欢
    • 2011-07-21
    • 1970-01-01
    • 2013-12-17
    • 1970-01-01
    • 2013-08-03
    • 1970-01-01
    • 2015-11-28
    • 2013-05-24
    相关资源
    最近更新 更多