如何在Delphi FMX的TChromium中添加带授权的代理?
在Delphi FMX的TChromium中配置带授权认证的代理
嘿,我完全懂你的困扰——TChromium组件本身确实没有直接暴露代理设置的属性,得深入它基于的CEF(Chromium Embedded Framework)框架来实现。下面是一套经过验证的实现方案,分步骤来:
1. 创建自定义的请求上下文处理类
要处理代理的授权认证,我们需要继承TCefRequestContextHandler并重写GetAuthCredentials方法,这个方法会在CEF检测到代理需要认证时被调用。
type TCustomRequestContextHandler = class(TCefRequestContextHandler) protected function GetAuthCredentials(const browser: ICefBrowser; const frame: ICefFrame; isProxy: Boolean; const host: ustring; port: Integer; const realm: ustring; const scheme: ustring; const callback: ICefAuthCallback): Boolean; override; end; function TCustomRequestContextHandler.GetAuthCredentials(const browser: ICefBrowser; const frame: ICefFrame; isProxy: Boolean; const host: ustring; port: Integer; const realm: ustring; const scheme: ustring; const callback: ICefAuthCallback): Boolean; begin Result := True; // 表示我们要处理这个认证请求 // 替换成你的代理用户名和密码 callback.Continue('your_proxy_username', 'your_proxy_password'); end;
2. 配置代理服务器并关联处理类
接下来,在TChromium初始化的时候,我们需要设置代理服务器地址,并把上面的自定义处理类绑定到请求上下文。通常可以在Form的OnCreate事件或者TChromium的OnBeforeCommandLineProcessing事件中做这件事:
procedure TForm1.FormCreate(Sender: TObject); var RequestContextSettings: TCefRequestContextSettings; CustomHandler: TCustomRequestContextHandler; begin // 初始化CEF(如果还没初始化的话,注意要在程序启动时先调用GlobalCEFApp.StartMainProcess) if not GlobalCEFApp.StartMainProcess then Exit; // 创建请求上下文设置 RequestContextSettings := TCefRequestContextSettings.Create; try // 设置代理服务器,格式:http://代理地址:端口 RequestContextSettings.ProxyServer := 'http://192.168.1.100:8080'; // 创建自定义处理类实例 CustomHandler := TCustomRequestContextHandler.Create; // 为TChromium设置自定义请求上下文 Chromium1.RequestContext := TCefRequestContext.Create(RequestContextSettings, CustomHandler); finally RequestContextSettings.Free; end; // 加载目标页面 Chromium1.Load('https://www.example.com'); end;
3. 关键注意事项
- CEF版本兼容性:确保你使用的Delphi CEF组件(比如DCEF3或者CEF4Delphi)版本是最新的,不同版本的API可能有细微差异,但核心逻辑一致。
- 代理格式:代理地址必须包含协议(
http://或socks://),否则CEF可能无法正确识别。 - 认证回调时机:
GetAuthCredentials只有在代理服务器返回407需要认证时才会被触发,如果你的代理不需要认证,可以跳过自定义处理类,直接设置ProxyServer即可。 - 内存管理:自定义处理类的生命周期会由CEF自动管理,无需手动调用
Free,避免内存泄漏。
如果遇到问题,可以通过GlobalCEFApp.LogFile设置CEF日志路径,日志会详细记录代理配置和认证的过程,方便排查问题。
内容的提问来源于stack exchange,提问作者FirmFreez
相关产品推荐
相关产品推荐

