如何防止Java Web Start应用程序缓存额外的下载资源

如何防止Java Web Start应用程序缓存额外的下载资源,java,caching,java-web-start,jnlp,Java,Caching,Java Web Start,Jnlp,我的JWS应用程序使用一个库(也是我的代码),它在后台从服务器检索各种XML文档: DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db = dbf.newDocumentBuilder(); Document doc = db.parse(xmlFileUrl); URL上的内容会不时更改,应用程序需要在启动时以及以后运行时重新获取内容 问题在于JWS缓存内容并返回缓存内容

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

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder(); 
Document doc = db.parse(xmlFileUrl);
URL上的内容会不时更改,应用程序需要在启动时以及以后运行时重新获取内容

问题在于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代码。欢迎使用其他方法和想法。

一件似乎有效的事情是将请求方法更改为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文档可能会错过读取HTTP响应头的机会,因此可能在编码方面遇到问题。

一件似乎有效的事情是将请求方法更改为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文档可能会错过读取HTTP响应头的机会,因此可能会在编码方面遇到问题。

我很惊讶以前没有看到
void java.net.URLConnection.setUseCaches(布尔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)。

我很惊讶我以前没有看到
void java.net.URLConnection.setUseCaches(布尔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)