Qt:Qt 6.3.0中QWebEngineCookieStore::loadAllCookies无法加载全部Cookie的bug

Qt 6.3.0中QWebEngineCookieStore::loadAllCookies无法加载全部Cookie的问题

文档所述:
void QWebEngineCookieStore::loadAllCookies()
Loads all the cookies into the cookie store. The cookieAdded() signal is emitted on every loaded cookie. Cookies are loaded automatically when the store gets initialized, which in most cases happens on loading the first URL. However, calling this function is useful if cookies should be listed before entering the web content.

其意当第一次加载url时,会触发加载事件。跟踪其源代码发现,实际是第一次加载url,会调用一次loadAllCookies。也就是说,这个函数可以不调用,系统会自动调用。此外,当没有网页界面的情况下,也就是没有QtWebEngineProcess.exe进程的情况下,调用loadAllCookies函数,实际是挂起了请求,在下一次触发网页请求时,才会执行loadAllCookies。

目前遇到的问题。此次从qt5升级到qt6,QtWebEngine模块改动较大。比如,支持了多国语言的开发者工具;默认的QWebEngineProfile不再存储数据到磁盘,即,默认的profile相当于隐身模式。而这个loadAllCookies也可能因此改出了bug,实际调用并不能加载cookies,经测试,此问题在qt5.15.2下并没有。

那么,QtWebEngine中到底应该如何获取到Cookie呢?经过本人分析,得出三种方法:

第一种就是js注入。页面加载完毕后,使用js返回document.cookie。这个应该是唯一合理的做法。

第二种是略微霸道一点的方法。通过sqlite读取QtWebEngine的Storage目录(具体参考QWebEngineProfile)下的Cookies文件,然后全部读取加载,实现自己想要的loadAllCookies功能。注意,这个操作必须是打开任意网址之前,否则文件会被QtWebEngineProcess锁定,导致无法读取了。读取完毕后,再连接cookieAdded和cookieRemoved信号,从而实现对Cookie的增删操作,确保程序的Cookie和chromium内核的同步。此法可以解决《方法三》在Qt6.3.0的bug。

第三种方法,也是目前主流的几个基于Qt实现的浏览器的做法,调用loadAllCookies,并连接cookieAdded和cookieRemoved信号,从而可以获得全部Cookie。

目前本人还是依赖于方法三,已向qt项目组报告此bug,静待修复。

 

转载请注明来源,谢谢。

有偿解决C++编程问题,承接项目定制开发;寻一份全职或兼职Windows C++开发工作。联系邮箱:[email protected]


老刀的技术日志 » Qt:Qt 6.3.0中QWebEngineCookieStore::loadAllCookies无法加载全部Cookie的bug

发表评论