Skip to content

WebView2 UserData 示例 - 多账号会话隔离 ​

概述 ​

演示 cWebView2Host 的多实例会话隔离功能。在 MDI 应用中,每个子窗体拥有独立的 WebView2 实例和 UserDataFolder,实现多账号并行登录、独立 Cookie 和 localStorage。

项目结构 ​

下载源码 [ 注意:重新到bin目录注册 DLL 文件 ]

代码请到 VBMAN2 项目 demos/webview2/userData 目录获取。

userData/
  ├── MDIForm1.frm           # MDI 父窗体,管理子窗体创建
  ├── Form1.frm              # MDI 子窗体,包含 WebView2 实例
  ├── pic/                   # 运行效果截图
  │   ├── 001.png
  │   ├── 002.png
  │   ├── 003.png
  │   ├── 004.png
  │   └── 005.png
  ├── UserDir/               # 预创建的用户数据目录
  │   ├── account-default/EBWebView/
  │   ├── account-001/EBWebView/
  │   ├── account-002/EBWebView/
  │   └── account-011/EBWebView/
  ├── vbman2_webview2.vbp    # VB6 项目文件(启动对象 = MDIForm1)
  └── vbman2_webview2.vbw    # VB6 工作区文件

核心代码解析 ​

1. MDI 父窗体(MDIForm1.frm) ​

vb
Private Sub MDIForm_Load()
    Form1.Init    ' 打开默认子窗口
End Sub

Private Sub OpenNewPage_Click()
    Dim Data As String: Data = InputBox(Tip, , "001,http://vb6.pro")
    If Data = "" Then Exit Sub
    Dim AppFix As String: AppFix = Left(Data, 4)
    Dim f As New Form1
    f.Init Left$(AppFix, 3), Mid$(Data, 5)   ' 账号后缀 + URL
End Sub

使用 Dim f As New Form1 动态创建 MDI 子窗体实例,每次输入格式为 账号后缀,URL。

2. MDI 子窗体(Form1.frm) ​

vb
Dim WithEvents wv As cWebView2Host
Dim AccountAppendFix As String
Dim ThisUrl As String

Public Sub Init(Optional ByVal UserDataFix As String, Optional ByVal Url As String)
    Me.Show
    If Url = "" Then Url = BASE_URL
    ThisUrl = Url
    AccountAppendFix = UserDataFix
    If AccountAppendFix = "" Then AccountAppendFix = "default"
    wv.Initialize Me    ' 传入 Form 对象
End Sub

3. 三阶段初始化 - 配置 UserDataFolder ​

vb
Private Sub wv_Create()
    ' 设置独立的用户数据目录
    wv.EnvironmentOptions.UserDataFolder = App.Path & "\UserDir\account-" & AccountAppendFix
End Sub

Private Sub wv_Ready()
    ' 导航到目标 URL
    wv.Navigate ThisUrl
End Sub

4. 标题同步 ​

vb
Private Sub wv_DocumentTitleChanged()
    Me.Caption = wv.DocumentTitle
End Sub

功能说明 ​

  1. 多账号会话隔离

    • 每个子窗体的 WebView2 使用不同的 UserDataFolder
    • Cookie、localStorage、登录状态完全独立
    • 同一网站可以在不同子窗体中登录不同账号
  2. 三阶段初始化模式

    • Initialize Me → 创建 WebView2(不传 URL)
    • wv_Create() → 配置 UserDataFolder
    • wv_Ready() → 执行 Navigate
  3. MDI 多实例架构

    • MDIForm1 作为父窗体
    • 每个子窗体独立创建 cWebView2Host 实例
    • 动态创建/销毁子窗体
  4. 预创建数据目录

    • UserDir/account-default/ 等目录预先创建
    • WebView2 会在目录下创建 EBWebView 子目录
    • 包含完整的浏览器数据(Cache、Cookies、Local Storage 等)

技术要点 ​

  1. UserDataFolder 的作用:WebView2 将所有用户数据(Cookie、Cache、localStorage、Session Storage、IndexedDB 等)存储在此目录。不同目录 = 完全隔离的浏览器会话

  2. wv.Initialize Me:传入 Form 对象,内部自动获取 hWnd。等效于 wv.Initialize Me.hWnd

  3. wv_Create vs wv_Ready:

    • Create 在 WebView2 控件创建后立即触发,是配置环境选项的最佳时机
    • Ready 在 WebView2 控件初始化完成后触发
  4. 多实例注意:WebView2 共享同一个浏览器进程(同一 UserDataFolder),不同 UserDataFolder 会创建独立的浏览器进程

应用场景 ​

  1. 多账号管理系统(社交媒体、电商平台)
  2. 并行测试不同用户角色的 Web 应用
  3. 浏览器隔离的隐私浏览
  4. 多租户 SaaS 应用客户端

扩展建议 ​

  1. 可以在子窗体中加入账号切换功能,通过切换 UserDataFolder 实现
  2. 可以记录每个账号的 UserDataFolder 路径,实现账号持久化
  3. 添加 Cookie 导出/导入功能,实现账号迁移

VB6及其LOGO版权为微软公司所有