JavaFx WebView缓存

Joh*_*ood 10 java caching webview

我一直在尝试为WebView实现基于光盘的缓存,但只取得了部分成功,我特别试图缓存.js javascript外部文件,这会大大减慢javascript网页的加载速度.

Oracle文档声明:"在使用WebView组件时,您应该记住它具有默认的内存缓存.这意味着一旦包含WebView组件的应用程序关闭,任何缓存的内容都将丢失.但是,开发人员可以实现通过java.net.ResponseCache类在应用程序级别缓存."

但这种情况并非如此.我使用java.net.ResponseCache类实现了内存缓存,但WebView很少使用它 - 它不时地从缓存中存储和检索favicon.png - 没有性能提升.

我通过分析WebView没有缓存的净流量来确认,从而确认了JDK-8014501中的内容:"在使用JavaFX WebView组件javafx.scene.web.WebView进行导航时,发现每个请求都从中检索所有资源每次服务器,即使先前的活动刚刚检索到资源.这种行为通过捕获和分析网络流量来验证.性能影响相当大."

似乎没有任何东西来自JDK-8014501,因此我使用"URL.setURLStreamHandlerFactory"编写了一个缓存处理程序,以拦截所有URLConnections到默认的sun处理程序.我在这方面取得了一些成功,并且能够缓存.js javascript文件并显着提高性能,但是有一些网站处理错误,特别是Outlook的电子邮件.

在查看我的代码处理方式时,我发现例如URLLoader代码设置了setUsesCaches(false),代码中包含以下注释(在当前1.8.0_66代码中的URLLoader.java的第279行):
//给定WebKit有自己的缓存,不要使用
//任何URLConnection缓存,即使有人安装它们.
//作为副作用,这解决了WebPane不能
正常使用插件缓存的问题,这是
导致RT-11880的原因之一.

那么有人可以告诉我一个真正发生的事情吗?

  • Oracle文档说WebKit有一个内存缓存,可以被ResponseCache覆盖,但事实并非如此.
  • JDK-8014501说明了这个问题,但已被标记为"不是问题".为什么不是问题?
  • 围绕"URL.setURLStreamHandlerFactory"和"URLConnection"拦截的重要编码产生了具有显着性能提升的功能缓存,但是被故意引入URLLoader代码的问题解除了.

提前感谢您的任何反馈,

P.J*_*sch 1

我一直在通过实现我自己的派生类HttpUrlConnectionHttpsUrlConnection使用我自己的URLStreamHandlerFactory.

基本上我拦截所有传出的 http 和 https 请求,检查缓存中是否有数据。如果没有,我从原始资源加载数据并将其存储在缓存目录中。如果我已经拥有数据,我会从缓存中传递它。

我还没有实现缓存头等,因为对于我的用例来说这是没有必要的。

这里要发布的代码太多,但如果您有兴趣,可以在mapjfx上查看代码,并特别检查包中的类com.sothawo.mapjfx.offline

该解决方案使 WebView 完全不知道缓存的实现。