【问题标题】:Save Cookies inside TIDCookieManager to file将 TIDCookieManager 中的 Cookie 保存到文件
【发布时间】:2013-01-01 04:59:01
【问题描述】:

如何将 TIdCookieManager 中的 cookie 保存到文件中,以便以后使用?像浏览器 cookie。

【问题讨论】:

    标签: delphi delphi-xe2 indy indy10 delphi-xe3


    【解决方案1】:

    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;
    

    【讨论】:

    • 是的,这确实回答了这个问题。我应该知道,考虑到我一开始就帮助编写了TIdCookieTIdCookieManager。您必须手动遍历TIdCookieManager.CookieCollection,写出单独的cookies 归档,然后自己读回它们,就像我展示的那样。为什么你说这不能回答问题?因为我没有包含任何文件 I/O 代码?我把它作为练习留给读者。
    • 至于TIdCookie 本身,在最近的版本中它是一个有效的类类型。如果您的版本无法识别它,那么您必须使用仍然基于不再存在的旧 TIdNetscapeCookieTIdCookieRFC2109TIdCookieRFC2965 类的过时版本,当 Indy 实施 RFC 6265 时替换为 TIdCookie .
    • 它们在IdCookie.pas 中声明。如果您查看实际的TIdCookie 类,它具有单独的属性,您可以根据需要一次读取/写入一个文件,或者您可以使用TIdCookie.ServerCookie 属性和TIdCookie.ParseServerCookie 方法。当我确实说过您必须手动读取/写入 cookie 值时,我认为不接受正确答案是不公平的。
    • 虽然我没有不接受这个答案,但我还是为最后几个 cmets 道歉。 +1 的答案!现在像魅力一样工作:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-01
    • 2018-12-19
    • 2012-10-13
    • 1970-01-01
    • 2019-10-25
    • 2022-12-11
    • 1970-01-01
    相关资源
    最近更新 更多