如何清除嵌入式Chromium浏览器的缓存和Cookie?

6
我使用TChromium创建了一个浏览器。 TChromium是动态创建的。 我需要访问Facebook(登录)。 在进程结束时,组件被销毁。 当再次创建组件时,问题出现了。 它继续使用之前的会话(登录)。 我需要清除所有缓存和Cookie。(强制注销)
下面是我创建组件的代码:
var
   Chromium: TChromium;
begin
   try
     Chromium := TChromium.Create(nil);
     Chromium.SetParentComponent(Form1);
     Chromium.Align := alClient;
     chromium.Browser.MainFrame.LoadUrl('www.facebook.com');

我这样销毁并释放内存:

我这样销毁并释放内存:

FreeAndNil(Chromium)

我该怎么做?


ApplicationCacheDisabled := true 和 PageCacheDisabled = true 这些选项不好。 - Junior Miguel Vieira
2个回答

5

DCEF1:

在DCEF1包装器中删除cookie,可以使用ICefCookieManager管理接口中的DeleteCookies函数。然而,我尝试使用以下代码删除所有cookie,但总是失败:

procedure TForm1.Button1Click(Sender: TObject);
var
  CookieManager: ICefCookieManager;
begin
  CookieManager := TCefCookieManagerRef.GetGlobalManager;
  if not CookieManager.DeleteCookies('', '') then
    ShowMessage('DeleteCookies failed!');
end;

幸运的是,使用这个Cookie管理器可以有另一种选项来删除cookie。访问所有的cookie,在visitor函数中将deleteCookie输出参数赋值为True。获取cookie管理器时要小心,它是在您第一次导航到某个地方时创建的(GetGlobalManager类函数是不安全的,没有正确处理意外结果),因此请确保您在导航后使用此代码:

procedure TForm1.Button1Click(Sender: TObject);
var
  CookieManager: ICefCookieManager;
begin
  CookieManager := TCefCookieManagerRef.GetGlobalManager;
  CookieManager.VisitAllCookiesProc(
    function(const name, value, domain, path: ustring; secure, httponly,
      hasExpires: Boolean; const creation, lastAccess, expires: TDateTime;
      count, total: Integer; out deleteCookie: Boolean): Boolean
    begin
      deleteCookie := True;
      ShowMessage('A cookie from domain ' + domain + ' will be unmercifully ' +
        'deleted!');
    end
  );
end;

DCEF3

在DCEF3包装器中,您可以使用以下内容。感谢Eric Santos提供的帮助:

type
  CefTask = class(TCefTaskOwn)
    procedure Execute; override;
  end;

procedure CefTask.Execute;
var
  CookieManager: ICefCookieManager;
begin
  CookieManager := TCefCookieManagerRef.Global;
  CookieManager.DeleteCookies('', '');
end;

procedure ClearCookies;
var
  Task: CefTask;
begin
  Task := CefTask.Create;
  CefPostTask(TID_IO, Task);
end;

你可以从这里提到的 URL 获取它,但你需要使用一些 SVN 客户端来获取它,例如 TortoiseSVN 或类似的(例如 一些便携式 SVN 客户端)。否则,你将不得不从源主干树下载所有文件。 - TLama
@TLama,您能否更新如何在DCEF3中使用DeleteCookies()的答案? - user1647411
@Eric,如果我知道怎么做,我会回答你的问题,但不幸的是我不知道,而且我现在很忙,无法深入研究这个主题。抱歉。 - TLama
@Eric,谢谢!我保留了原始的DeleteCookies选项,因为DCEF1包装器中最初存在一个错误。ICefCookieManager::DeleteCookies应该可以工作,也许在最近的DCEF1版本中已经可以工作(我不知道,但我希望:-)。只是一个小提示,您不需要实现那些只调用inherited的方法,因为它们实际上什么都不做,只是调用其祖先的方法。 - TLama
@TLama,实际上我现在不需要这个了。因为我使用Indy。我已经完善它了。每个线程都与全局Cookie管理器同步。 :) - user1647411
显示剩余6条评论

1

TLama,您的帮助对我的项目至关重要。感谢您分享您的经验。

使用以下代码解决了我的问题:

procedure TForm1.Button1Click(Sender: TObject);
var
  CookieManager: ICefCookieManager;
begin
  CookieManager := TCefCookieManagerRef.GetGlobalManager;
  CookieManager.VisitAllCookiesProc(
    function(const name, value, domain, path: ustring; secure, httponly,
      hasExpires: Boolean; const creation, lastAccess, expires: TDateTime;
      count, total: Integer; out deleteCookie: Boolean): Boolean
    begin
      deleteCookie := True;
      ShowMessage('A cookie from domain ' + domain + ' will be unmercifully ' +
        'deleted!');
    end
  );
end;

拥抱


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接