使用CookieManager
WebViewer提供了CookieManager用于管理浏览器中的Cookie,可以添加、删除、修改和查询Cookie。
CookieManager通过CoreWebViewer.CookieManager属性获得。
本节内容可以参考示例文件"CaseStudy\WebViewer\Cookie管理.Table"。
Cookie对象
CookieManager操作的是CoreWebViewerCookie对象,该对象有以下主要属性:
| 属性 | 类型 | 说明 |
|---|---|---|
| Name | String | Cookie的名称 |
| Value | String | Cookie的值 |
| Domain | String | Cookie关联的域名 |
| Path | String | Cookie关联的路径 |
| Expires | DateTime | Cookie的过期时间,如果为DateTime.MaxValue表示会话Cookie |
| IsHttpOnly | Boolean | 是否仅允许HTTP访问(JS无法读取) |
| IsSecure | Boolean | 是否仅允许HTTPS连接发送 |
| IsSession | Boolean | 是否为会话Cookie(浏览器关闭即失效) |
| SameSite | CoreWebViewerCookieSameSiteKind | SameSite策略:None、Lax、Strict |
CookieManager的主要方法
| 方法 | 说明 |
|---|---|
| CreateCookie | 创建一个新的Cookie对象,需要设置Name、Value、Domain、Path等属性 |
| AddOrUpdateCookie | 添加或更新Cookie |
| DeleteCookie | 删除指定的Cookie |
| DeleteCookies | 删除符合条件的所有Cookie,可指定域名和路径 |
| DeleteCookiesWithDomainAndPath | 删除指定域名和路径的所有Cookie |
| DeleteCookiesWithDomain | 删除指定域名的所有Cookie |
| DeleteAllCookies | 删除所有Cookie |
| GetCookiesAsync | 异步获取指定域名的所有Cookie |
示例一
添加和查询Cookie:
'''Async
Dim
wv
As
WebViewer = e.Form.Controls("WebViewer1").WebViewer
Dim
cookieManager = wv.CoreWebView2.CookieManager
' 1.
创建一个普通Cookie(7天后过期)
Dim
cookie1 = cookieManager.CreateCookie("username",
"张三",
".example.com",
"/")
cookie1.Expires = DateTime.Now.AddDays(7)
' 7天后过期
cookie1.IsSecure =
False
cookie1.IsHttpOnly =
False
cookieManager.AddOrUpdateCookie(cookie1)
' 2.
创建一个HttpOnly
Cookie(只能通过HTTP访问,JS无法读取)
Dim
cookie2 = cookieManager.CreateCookie("session_id",
"abc123xyz",
".example.com",
"/")
cookie2.Expires = DateTime.Now.AddHours(2)
' 2小时后过期
cookie2.IsSecure =
True
'
仅HTTPS发送
cookie2.IsHttpOnly =
True
' JS无法读取
cookieManager.AddOrUpdateCookie(cookie2)
' 3.
创建一个会话Cookie(浏览器关闭即失效)-
设置Expires为DateTime.MaxValue
Dim
cookie3 = cookieManager.CreateCookie("temp_token",
"temp456",
".example.com",
"/admin")
cookie3.Expires = DateTime.MaxValue
'
设置为最大值表示会话Cookie
cookie3.IsSecure =
True
cookie3.IsHttpOnly =
True
cookieManager.AddOrUpdateCookie(cookie3)
' 4.
创建一个持久化Cookie(30天后过期)
Dim
cookie4 = cookieManager.CreateCookie("user_preference",
"theme=dark&lang=zh",
".example.com",
"/")
cookie4.Expires = DateTime.Now.AddDays(30)
' 30天后过期
cookie4.IsSecure =
False
cookie4.IsHttpOnly =
False
cookieManager.AddOrUpdateCookie(cookie4)
' 5.
创建一个带SameSite策略的Cookie(用于CSRF防护)
Dim
cookie5 = cookieManager.CreateCookie("csrf_token",
"xyz789abc",
".example.com",
"/")
cookie5.Expires = DateTime.Now.AddDays(1)
cookie5.SameSite = CoreWebView2CookieSameSiteKind.Strict
' Strict模式
cookie5.IsSecure =
True
cookie5.IsHttpOnly =
True
cookieManager.AddOrUpdateCookie(cookie5)
' 6.
查询并显示所有Cookie
Dim
cookies =
Await
cookieManager.GetCookiesAsync("https://example.com")
Dim
msg
As
String
=
""
For
i
As
Integer
= 0
To
cookies.Count - 1
msg = msg &
"【Cookie
"
& (i + 1) &
"】"
& vbCrLf
msg = msg &
"名称:
"
& cookies(i).Name & vbCrLf
msg = msg &
"值:
"
& cookies(i).Value & vbCrLf
msg = msg &
"域名:
"
& cookies(i).Domain & vbCrLf
msg = msg &
"路径:
"
& cookies(i).Path & vbCrLf
If
cookies(i).IsSession
Then
msg = msg &
"类型:
会话Cookie(浏览器关闭即失效)"
& vbCrLf
Else
msg = msg &
"过期时间:
"
& cookies(i).Expires.ToString() & vbCrLf
End
If
msg = msg &
"Secure: "
& cookies(i).IsSecure & vbCrLf
msg = msg &
"HttpOnly: "
& cookies(i).IsHttpOnly & vbCrLf
msg = msg &
"SameSite: "
& cookies(i).SameSite.ToString() & vbCrLf
msg = msg &
"------------------------"
& vbCrLf & vbCrLf
Next
MessageBoxA.Show(msg,
"Cookie列表",
MessageBoxButtons.OK, MessageBoxIcon.Information)
提示:我们增加了5个Cookie,但是查询结果只显示4个Cookie,是因为第3个会话Cookie temp_token 的路径设置为 /admin,而查询URI是根路径 /。根据Cookie的路径匹配规则,GetCookiesAsync只返回当前路径及其父路径的Cookie。如果需要查看/admin路径下的Cookie,可以将查询URI改为 "https://example.com/admin"
示例二
删除Cookie的多种方式:
'''Async
Dim
wv
As
WebViewer = e.Form.Controls("WebViewer1").WebViewer
Dim
cookieManager = wv.CoreWebView2.CookieManager
' 1. 删除指定的单个Cookie(需要先查询再删除)
Dim
cookies =
Await
cookieManager.GetCookiesAsync("https://example.com")
For
i
As
Integer
= 0
To
cookies.Count - 1
If
cookies(i).Name =
"username"
Then
cookieManager.DeleteCookie(cookies(i))
End
If
Next
' 2.
删除指定名称和域名的所有Cookie
cookieManager.DeleteCookies("username",
".example.com")
' 3.
删除指定名称、域名和路径的所有Cookie
cookieManager.DeleteCookiesWithDomainAndPath("username",
".example.com",
"/")
' 4.
删除所有Cookie(谨慎使用)
If
Await
MessageBoxA.Show("确定要删除所有Cookie吗?",
"提示",
MessageBoxButtons.YesNo) = DialogResult.Yes
Then
cookieManager.DeleteAllCookies()
End
If
示例三
修改Cookie的值:
'''Async
Dim
wv
As
WebViewer = e.Form.Controls("WebViewer1").WebViewer
Dim
cookieManager = wv.CoreWebView2.CookieManager
' 查询要修改的Cookie
Dim
cookies =
Await
cookieManager.GetCookiesAsync("https://example.com")
For
i
As
Integer
= 0
To
cookies.Count - 1
If
cookies(i).Name =
"username"
Then
'
修改值
cookies(i).Value =
"李四"
'
也可以修改过期时间等属性
cookies(i).Expires = DateTime.Now.AddDays(30)
'
更新Cookie(添加操作会覆盖已有Cookie)
cookieManager.AddOrUpdateCookie(cookies(i))
Await
MessageBoxA.Show("Cookie已修改为:
"
& cookies(i).Value)
Exit
For
End
If
Next
重要提示:
1、通过GetCookiesAsync获取Cookie时,参数必须是完整的URL(包含协议),例如 "https://example.com"。
2、删除Cookie时,需要创建与被删除Cookie完全相同的Name、Domain和Path才能删除成功,建议先查询再删除。上面示例中的DeleteCookiesWithDomainAndPath等方法是专门用于批量删除的,不需要先查询。
3、Cookie的Domain设置以点开头(如 ".example.com")表示匹配所有子域名,不加点只匹配精确域名。
4、修改Cookie实际上是创建一个同名、同Domain、同Path的新Cookie,然后调用AddOrUpdateCookie覆盖原值。