JavaFXWebView缓存

JavaFXWebView缓存,java,caching,webview,Java,Caching,Webview,我一直在尝试为WebView实现一个基于磁盘的缓存,但只取得了部分成功,我特别尝试缓存.js javascript外部文件,这大大降低了javascript网页的加载速度 Oracle文档说明: “在使用WebView组件时,您应该记住它具有默认的内存缓存。 这意味着一旦包含WebView组件的应用程序关闭,任何缓存内容都将丢失。 但是,开发人员可以通过java.net.ResponseCache类在应用程序级别实现缓存。” 但事实并非如此。我使用java.net.ResponseCache类实

我一直在尝试为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”编写了一个缓存处理程序,以拦截到默认sun处理程序的所有URL连接。我在这方面取得了一些成功,能够缓存.js javascript文件并显著提高性能,但在处理某些网站时,尤其是Outlook的电子邮件时,出现了一些bug

在查看我的代码处理方式时,我发现,例如,URLLoader代码正在设置setUseSaches(false),代码中有以下注释(在当前1.8.0_66代码中URLLoader.java的第279行):
//鉴于WebKit有自己的缓存,请不要使用
//任何URLConnection缓存,即使有人安装了它们。
//作为一个副作用,这解决了WebPane not的问题
//与插件缓存配合良好,这是
//RT-11880的原因

有人能告诉我到底发生了什么吗

  • Oracle文档称WebKit有一个内存缓存,可以被ResponseCache覆盖,但事实并非如此
  • JDK-8014501说明了问题,但已标记为“非问题”。为什么这不是一个问题
  • 围绕“URL.setURLStreamHandlerFactory”和“URLConnection”截取的signifant编码产生了一个功能性缓存,具有显著的性能提升,但由于故意引入到urloader代码中的问题而被撤销

提前感谢您的反馈,

我通过实现自己从
HttpUrlConnection
HttpsUrlConnection
派生的类,并使用自己的
URLStreamHandlerFactory
实现,一直在围绕非缓存WebView工作

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

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

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


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

我有相反的效果/问题。我的CSS文件被WebView缓存,我无法阻止它!对我的CSS的更改只有在重新启动整个Java(FX)应用程序(或者在每次更改时重命名CSS文件)后才可见。重写
ResponseCache
对我来说不起作用(我的响应缓存永远不会被调用)…奇怪的是,这也是与你的问题完全相反的问题:@Ben你有解决问题的运气吗?我也有同样的问题。