使用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. 创建一个普通Cookie7天后过期)
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(浏览器关闭即失效)- 设置ExpiresDateTime.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. 创建一个持久化Cookie30天后过期)
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覆盖原值。


本页地址:http://www.foxtable.com/webhelp/topics/6268.htm