【发布时间】:2013-01-01 04:59:01
【问题描述】:
如何将 TIdCookieManager 中的 cookie 保存到文件中,以便以后使用?像浏览器 cookie。
【问题讨论】:
标签: delphi delphi-xe2 indy indy10 delphi-xe3
如何将 TIdCookieManager 中的 cookie 保存到文件中,以便以后使用?像浏览器 cookie。
【问题讨论】:
标签: delphi delphi-xe2 indy indy10 delphi-xe3
TIdCookieManager 不支持在文件中持久化 cookie 数据。您必须手动实现。使用TIdCookieManager.CookieCollection 属性访问cookie 对象列表。例如:
uses
..., IdCookie, IdCookieManager;
var
Cookies: TIdCookieList;
Cookie: TIdCookie;
I: Integer;
begin
Cookies := IdCookieManager.CookieCollection.LockCookieList(caRead);
try
for I := 0 to Cookies.Count-1 do
begin
Cookie := Cookies[I];
// save Cookie properties as needed...
end;
finally
IdCookieManager.CookieCollection.UnlockCookieList(caRead);
end;
end;
.
uses
..., IdCookie, IdCookieManager;
var
Cookies: TIdCookies;
Cookie: TIdCookie;
begin
Cookies := IdCookieManager.CookieCollection.LockCookieList(caReadWrite);
try
for (each saved cookie) do
begin
Cookie := IdCookieManager.CookieCollection.Add;
try
// read Cookie properties as needed...
Cookies.Add(Cookie);
except
Cookie.Free;
raise;
end;
end;
finally
IdCookieManager.CookieCollection.UnlockCookieList(caReadWrite);
end;
end;
或者:
uses
..., IdCookie, IdCookieManager;
var
Cookies: TIdCookieList;
Cookie: TIdCookie;
I: Integer;
S: string;
begin
Cookies := IdCookieManager.CookieCollection.LockCookieList(caRead);
try
for I := 0 to Cookies.Count-1 do
begin
Cookie := Cookies[I];
S := Cookie.ServerCookie;
// save S as needed...
end;
finally
IdCookieManager.CookieCollection.UnlockCookieList(caRead);
end;
end;
.
uses
..., IdCookie, IdCookieManager, IdURI;
var
S: string;
Cookies: TIdCookies;
Cookie: TIdCookie;
Uri: TIdURI;
begin
Cookies := IdCookieManager.CookieCollection.LockCookieList(caReadWrite);
try
for (each saved cookie) do
begin
// read S as needed
S := ...;
Uri := TIdURI.Create(URL where cookie came from);
try
Cookie := IdCookieManager.CookieCollection.Add;
try
Cookie.ParseServerCookie(S, Uri);
Cookies.Add(Cookie);
except
Cookie.Free;
raise;
end;
finally
Uri.Free;
end;
finally
IdCookieManager.CookieCollection.UnlockCookieList(caReadWrite);
end;
end;
【讨论】:
TIdCookie 和TIdCookieManager。您必须手动遍历TIdCookieManager.CookieCollection,写出单独的cookies 归档,然后自己读回它们,就像我展示的那样。为什么你说这不能回答问题?因为我没有包含任何文件 I/O 代码?我把它作为练习留给读者。
TIdCookie 本身,在最近的版本中它是一个有效的类类型。如果您的版本无法识别它,那么您必须使用仍然基于不再存在的旧 TIdNetscapeCookie、TIdCookieRFC2109 和 TIdCookieRFC2965 类的过时版本,当 Indy 实施 RFC 6265 时替换为 TIdCookie .
IdCookie.pas 中声明。如果您查看实际的TIdCookie 类,它具有单独的属性,您可以根据需要一次读取/写入一个文件,或者您可以使用TIdCookie.ServerCookie 属性和TIdCookie.ParseServerCookie 方法。当我确实说过您必须手动读取/写入 cookie 值时,我认为不接受正确答案是不公平的。