如何在 NodeJS 中维护请求会话
Posted
技术标签:
【中文标题】如何在 NodeJS 中维护请求会话【英文标题】:How to maintain a request session in NodeJS 【发布时间】:2013-11-25 01:06:43 【问题描述】:我正在尝试使用NodeJS
抓取需要POST
登录的网站。
登录后,我可以通过GET
访问单独的网页。
现在的第一个问题是登录。我尝试使用request
到POST
的登录信息,但我得到的响应似乎没有登录。
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 中维护请求会话的主要内容,如果未能解决你的问题,请参考以下文章
Nodejs + Passport.js + Redis:如何在 Redis 中存储会话