故障排除会话使用libcurl过期

时间:2014-09-13 14:43:24

标签: http session curl cookies libcurl

我正在尝试使用c中的libcurl登录网站(http网站,而不是https)。问题是,登录后如果我尝试访问域中的页面,我会被重定向到声称我的会话已过期的页面,我需要重新登录。

然后我假设网站使用的会话cookie一定存在问题。这是我用来处理cookie的代码。当我进入登录页面时,我在第一次请求时使用这些设置。

curl_easy_setopt(curl, CURLOPT_COOKIEFILE, "cookie.txt");
curl_easy_setopt(curl, CURLOPT_COOKIEJAR, "cookie.txt");
curl_easy_setopt(curl, CURLOPT_COOKIESESSION, 1);

然后我使用CURLOPT_VERBOSE来获取有关会话的信息。我似乎确实收到了一个cookie并在随后的请求中再次发送它。

Set-Cookie: PHPSESSID=2d952576829405ce0d25689804b525ec; path=/

此cookie也用于以下请求:

Cookie: PHPSESSID=2d952576829405ce0d25689804b525ec

最后,当我去cookie.txt时,我也看到了那里的cookie:

domain  FALSE   /   FALSE   0   PHPSESSID   2d952576829405ce0d25689804b525ec

总而言之,我的问题是:如何进一步解决过期会话的问题?互联网上的大多数消息来源解释了如何让cookie工作,但在这种情况下,我没有看到cookie的问题。

编辑:使用Vasiliy Faronov提供的一般方法我发现通常会从javascript响应中生成两个额外的cookie。显然libcurl不解释javascript,因此不会创建cookie。在模仿cookie的价值后,一切都应该有效,所以我会考虑解决这个问题。

1 个答案:

答案 0 :(得分:1)

如果您的Web资源适用于Web浏览器,但不适用于程序化请求,则一般操作过程很简单。

  1. 让自己详细检查发送的请求和响应。在您的情况下,您可以使用Web浏览器的开发人员工具和CURLOPT_VERBOSE。在许多情况下,数据包嗅探器将起作用。
  2. 与Web浏览器成功交互并捕获请求/响应流程。
  3. 以编程方式重现相同的请求/响应流程。如果您以完全相同的方式提出请求,尽可能复制所有消息详细信息,通常应该获得相同的成功结果。
  4. 逐步改变您的计划。逐个删除不需要的标题和Cookie,替换User-Agent,依此类推。在某些时候,互动会破坏,你会知道,例如该特定标题是重要的。或者它根本不会破裂。