CEF4双Chromium实例如何配置独立Cookie路径实现同站双账号登录
核心逻辑
CEF的Cookie、站点缓存、本地存储等用户数据是和CefRequestContext请求上下文绑定的,默认所有浏览器实例都会复用全局默认的请求上下文,共用你在GlobalCEFApp.cache中配置的同一份存储,因此同一站点只能保持一个登录态。要实现两个实例登录态隔离,只需要给两个实例分别绑定独立的、指定了专属存储路径的请求上下文即可,无需启动多个CEF进程。
操作步骤
- 调整全局CEF初始化配置
修改原有CreateGlobalCEFApp过程中的cache配置,避免全局默认上下文占用业务存储路径:
procedure CreateGlobalCEFApp; var inicef: Tinifile; path: string; begin GlobalCEFApp := TCefApplication.Create; GlobalCEFApp.LogFile := 'debug.log'; GlobalCEFApp.LogSeverity := LOGSEVERITY_INFO; // 全局默认上下文使用独立的缓存路径,不要和业务实例的存储路径混用 GlobalCEFApp.cache := 'cache\global_common'; GlobalCEFApp.EnablePrintPreview := True; path := ExtractFilePath(ParamStr(0)); GlobalCEFApp.DisableFeatures := 'WinUseBrowserSpellChecker'; inicef := Tinifile.Create(path + 'settings.ini'); GlobalCEFApp.UserAgent := Pchar(inicef.ReadString('Chrome', 'UserAgent', '')); inicef.free; end;
- 为两个Chromium实例分别创建独立请求上下文
在浏览器实例初始化(调用CreateBrowser方法)之前,为每个实例单独配置专属存储路径的请求上下文并绑定,示例代码如下:
// 给第一个Chromium实例配置独立存储 var reqCtx1: ICefRequestContext; ctxSettings1: TCefRequestContextSettings; begin FillChar(ctxSettings1, SizeOf(ctxSettings1), 0); // 指定实例1专属的缓存根目录,Cookie会自动存储在该目录下 CefString(@ctxSettings1.cache_path, PChar(ExtractFilePath(ParamStr(0)) + 'cache\profile_1')); // 开启会话Cookie持久化,关闭程序后登录态不会丢失,不需要可设为False ctxSettings1.persist_session_cookies := Ord(True); reqCtx1 := TCefRequestContextRef.New(@ctxSettings1, nil, nil, False, False); Chromium1.RequestContext := reqCtx1; end; // 给第二个Chromium实例配置独立存储 var reqCtx2: ICefRequestContext; ctxSettings2: TCefRequestContextSettings; begin FillChar(ctxSettings2, SizeOf(ctxSettings2), 0); // 指定实例2专属的缓存根目录,必须和实例1路径完全独立 CefString(@ctxSettings2.cache_path, PChar(ExtractFilePath(ParamStr(0)) + 'cache\profile_2')); ctxSettings2.persist_session_cookies := Ord(True); reqCtx2 := TCefRequestContextRef.New(@ctxSettings2, nil, nil, False, False); Chromium2.RequestContext := reqCtx2; end;
注意事项
- 两个实例的
cache_path必须是完全独立的文件夹,不能有路径重叠,否则会出现数据串用、文件锁冲突的问题 - 如果不需要持久化登录态,可以将对应实例的
cache_path设为空,此时实例会使用内存级临时存储,关闭程序后所有Cookie、站点数据自动清除,两个实例的临时存储同样完全隔离 - 绑定请求上下文的操作必须在浏览器实例完成初始化之前执行,已经创建完成的浏览器实例不支持中途切换请求上下文
- 配置完成后两个实例的Cookie、LocalStorage、IndexedDB、站点缓存、权限配置等所有站点数据都会完全隔离,可直接满足同一站点同时登录两个不同账号的需求
内容的提问来源于stack exchange,提问作者Sten
相关产品推荐
相关产品推荐

