如何防止Java Web Start应用程序缓存其他下载资源

时间:2015-10-03 19:02:37

标签: java caching java-web-start jnlp

我的JWS应用程序使用一个库(也是我的代码),它从服务器检索各种XML文档:

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder(); 
Document doc = db.parse(xmlFileUrl);

网址上的内容会不时更改,应用程序需要在启动时及之后的运行时重新获取内容。

问题是JWS缓存内容并返回后续请求的缓存内容。

告诉JWS删除URL的缓存内容确实有效:

DownloadService ds = (DownloadService)ServiceManager.lookup("javax.jnlp.DownloadService");
ds.removeResource(xmlFileUrl, null);

但是库被其他前端使用,我想避免使库依赖于javaws.jar。我当前的解决方案定义了库中的一个接口,允许库请求缓存清除。 JWS启动程序将接口的实现传递给库。有多个组件可以获取各种资源,虽然我可以使它工作,但整个过程都很笨拙。

另一种解决方法是为每个请求附加一个唯一的查询,例如

url += "?ignored="+System.currentTimeMillis()+Math.random();

但这会污染JWS缓存,我认为它是混乱,wtf和膨胀的来源。

在服务器上生成XML文档。设置标题:

Cache-Control: no-cache'

无济于事。

如果对此问题有更清晰解决方案,我感兴趣。如果我可以在服务器上设置一些理想的HTTP标头。列出不在.jnlp中缓存的资源是可以接受的但不理想,因为URL是在库中构建的,我必须显着更改init代码。欢迎其他方法和想法。

2 个答案:

答案 0 :(得分:0)

似乎有一件事是将请求方法更改为POST:

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder(); 

// open connection manually to set request method to POST
HttpURLConnection connection = (HttpURLConnection)url.openConnection();
connection.setRequestMethod("POST");

Document doc = db.parse(connection.getInputStream());

这解决了我当前的任务。 我不确定这是否适用于重新获取,例如图像。

直接从InputStream构建XML Document可能会错过读取HTTP响应头的机会,因此可能会遇到编码问题。

答案 1 :(得分:0)

我很惊讶我之前没有看到void java.net.URLConnection.setUseCaches(boolean usecaches)方法。

此解决方案适用于JWS。 它不依赖于javaws.jar,它简洁明了。

URL url = new URL(xmlFileLocation);
URLConnection connection = url.openConnection();
// Prevent JavaWebStart from returning cached copy.
connection.setUseCaches(false);

// Now fetch the content, e.g.
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder(); 
Document doc = db.parse(connection.getInputStream());

这仍然是落后的,因为使用服务器响应的应用程序决定不使用缓存,而不是遵循服务器端缓存控制HTTP头的框架(JWS)。