1

使用 Delphi 安装的 Delphi XE2 Update 4 和 Indy 组件 10.5.8.0。

出于安全原因,我正在尝试使用的网站故意向我发送一个日期已过期的 cookie。这是他们深思熟虑的,我不得不忍受它,其他与他们合作的开发人员已经设法做到了。

服务器对我的响应IdHTTP.Get()如下所示:

Recv 8/30/2012 3:06:15 PM: HTTP/1.1 200 OK<EOL>
Date: Thu, 30 Aug 2012 19:06:35 GMT<EOL>
Server: Apache/2.2.3 (CentOS)<EOL>
X-Powered-By: PHP/5.1.6<EOL>
Set-Cookie: dati=eJxLtDKxqi62MrdSykyJLy1OLVKyLrYytVIyNjcxtISyc%2FLTM%2FNAbKAqt4CgYJfUMhDPEqinOB4omZ6aAuIbWilFgmkDkGGpeSWZaZkQ8wyNrZTSchKLMwryM%2FNK4ouKlaxrAYdvJUQ%3D; 
expires=Thu, 01-Jan-1970 00:03:00 GMT<EOL>
Content-Length: 16<EOL>
Connection: close<EOL>
Content-Type: text/plain;; charset=ISO-8859-1<EOL><EOL>
0 24.141.251.145

请注意 1970 年到期!我已经使用 Indy 3 天了,据我所知,这种创建 cookie 的尝试被 IdHttp 和相关的 CookieManager 简单地忽略了。

假设我无论如何都需要接收和使用 cookie,那么捕获它的正确方法是什么,或者我现在应该尖叫着逃跑吗?我有很多德尔福的经验,但这是我第一次涉足互联网连接的美妙世界,这个到达时过期的饼干业务让我摸不着头脑!

4

1 回答 1

5

发送过期的 cookie 是网络服务器在客户端删除 cookie 的方式。Indy 的 cookie 管理器支持这一点。当它收到一个 cookie 时,它​​将删除任何现有的同名/域/路径三重奏的 cookie,然后如果新 cookie 已过期,则将其丢弃。这是硬编码的行为。

如果出于某种原因,您必须保留过期的 cookie(这没有任何意义,因为任何 web 客户端都不应该这样做),您将不得不在 cookie 被解析之后但之前使用该TIdCookieManager.OnNewCookie事件来更改 cookie 的过期时间TIdCookie由 处理TIdCookieManager。您可以将TIdCookie.Expires属性设置为将来的日期,或0.0禁用其到期。无论如何,您都必须这样做,因为TIdCookieManager实现了过期 cookie 的清理(每当TIdHTTP请求 cookie 在 HTTP 请求中发送时都会触发),因此如果您不更改过期时间,那么 cookie 无论如何都会在稍后被丢弃时间。

于 2012-08-31T00:38:13.933 回答