使用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,那么捕捉它的正确方法是什么,或者我现在应该只是逃跑?我有很多德尔福的经验,但这是我第一次涉足互联网连接的精彩世界,这个到期的到期cookie业务让我感到头疼!
答案 0 :(得分:5)
发送过期的cookie是网络服务器在客户端删除cookie的方式。 Indy的cookie经理支持这一点。当它收到cookie时,它将删除任何相同名称/域/路径三重奏的现有cookie,然后丢弃新cookie(如果已经过期)。这是硬编码行为。
如果出于某种原因,你必须保留过期的cookie(这没有任何意义,因为没有webclient应该这样做),你将不得不使用TIdCookieManager.OnNewCookie
事件来改变cookie的过期在TIdCookie
解析之后但由TIdCookieManager
处理之前。您可以将TIdCookie.Expires
属性设置为将来的日期,或设置为0.0
以禁用其到期日期。无论如何,你必须这样做,因为TIdCookieManager
实现了过期cookie的清理(只要TIdHTTP
要求cookie在HTTP请求中发送就会触发),所以如果你不改变过期,那么cookie随后会被丢弃。