我的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代码。欢迎其他方法和想法。
答案 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)。