动态生成的JNLP在本地缓存

时间:2017-04-04 18:45:27

标签: java caching applet java-web-start jnlp

我们正在通过servlet生成JNLP,以便在JWS中运行applet。 首次下载后,缓存该文件的副本(我可以通过ControlPanel在java的临时文件中看到它)。当我尝试下载上传的applet时,applet会以缓存的

运行

以下生成的JNLP示例

<jnlp spec="1.0+" >
<information>
    <title>SA</title>
    <vendor>FOO</vendor>
    <homepage href="https://ddd-003:8181/Server/Applets/www.foo.it"/>
    <description>Applet</description>
    <description kind="short">SA</description>
  </information>
  <security>
    <all-permissions/>
  </security>
  <update check="always" policy="always"/>
  <resources>
    <java java-vm-args="-Djava.security.policy=applet.policy" version="1.6+"/>
    <jar href="https://dddd-003.foo.it:8181/Server/Applets/SA.jar" download="eager" main="true"/>
  </resources>
  <applet-desc name="SA" main-class="com.foo.sign.applet.SPRemote" width="1004" height="80">
    <param name="fileHandler" value="20170404195941440076"/>
    <param name="timestampId" value="default"/>
    .....
    <param name="layoutType" value="ORIZ"/>
  </applet-desc>
</jnlp>

我尝试在JNLP文件中设置codebase和href(href与为按钮生成的相同),

<jnlp spec="1.0+" codebase="https://ddd-003.foo.it" 
 href="/Server/servlet/IntfServlet?cusId=020184050148978&appId=4&handId=20170404203437419794&opcode=jnlp" >

但是我收到了一个例外

java.lang.RuntimeException: java.lang.reflect.InvocationTargetException
at com.sun.javaws.Launcher.executeApplet(Unknown Source)
 at com.sun.javaws.Launcher.launchAppUsingAppletLifecycle(Unknown Source)
 at com.sun.javaws.Launcher.prepareToLaunch(Unknown Source)
 at com.sun.javaws.Launcher.prepareToLaunch(Unknown Source)
 at com.sun.javaws.Launcher.launch(Unknown Source)
 at com.sun.javaws.Main.launchApp(Unknown Source)
 at com.sun.javaws.Main.continueInSecureThread(Unknown Source)
 at com.sun.javaws.Main.access$000(Unknown Source)
 at com.sun.javaws.Main$1.run(Unknown Source)
 at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.reflect.InvocationTargetException
 at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
 at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
 at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
 at java.lang.reflect.Method.invoke(Method.java:498)
 at com.sun.javaws.Launcher$3.run(Unknown Source)
 ... 1 more
Caused by: java.lang.NullPointerException
 at sun.plugin2.applet.viewer.JNLP2Viewer.parseAndInitialize(Unknown Source)
 at sun.plugin2.applet.viewer.JNLP2Viewer.run(Unknown Source)
 at sun.plugin2.applet.viewer.JNLP2Viewer.main(Unknown Source)
 ... 6 more

在控制台中我看到了

Java.net.MalformedURLException: no protocol: 
 at java.net.URL.<init>(URL.java:593)
 at java.net.URL.<init>(URL.java:490)
 at java.net.URL.<init>(URL.java:439)
 at com.sun.deploy.cache.CachedJarFile.<init>(Unknown Source)
 at com.sun.deploy.cache.CacheEntry$4.run(Unknown Source)
 at java.security.AccessController.doPrivileged(Native Method)
 at com.sun.deploy.cache.CacheEntry.getJarFile(Unknown Source)
 at com.sun.deploy.cache.ResourceProviderImpl.getResourceObject(Unknown Source)
 at sun.plugin2.applet.viewer.JNLP2Viewer.parseAndInitialize(Unknown Source)
 at sun.plugin2.applet.viewer.JNLP2Viewer.run(Unknown Source)
 at sun.plugin2.applet.viewer.JNLP2Viewer.main(Unknown Source)
 at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
 at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
 at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
 at java.lang.reflect.Method.invoke(Method.java:498)
 at com.sun.javaws.Launcher$3.run(Unknown Source)
 at java.lang.Thread.run(Thread.java:745)
java.net.MalformedURLException: no protocol: 
 at java.net.URL.<init>(URL.java:593)
 at java.net.URL.<init>(URL.java:490)
 at java.net.URL.<init>(URL.java:439)
 at com.sun.deploy.cache.ResourceProviderImpl$1.getResourceURL(Unknown Source)
 at sun.plugin2.applet.viewer.JNLP2Viewer.parseAndInitialize(Unknown Source)
 at sun.plugin2.applet.viewer.JNLP2Viewer.run(Unknown Source)
 at sun.plugin2.applet.viewer.JNLP2Viewer.main(Unknown Source)
 at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
 at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
 at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
 at java.lang.reflect.Method.invoke(Method.java:498)
 at com.sun.javaws.Launcher$3.run(Unknown Source)
 at java.lang.Thread.run(Thread.java:745)
#### Java Web Start Error:
#### java.lang.reflect.InvocationTargetException

替代方法可能是在执行applet代码的init后删除缓存的JNLP文件,但我不知道如何以编程方式访问缓存文件夹 任何帮助欣赏

更新

我忘了提到我尝试以多种方式设置HttpResponse的标头。

最后一次尝试是

            res.setIntHeader("Expires", 0);
            res.setContentType("application/x-java-jnlp-file");
            res.setHeader("x-java-jnlp-version-id", "1.6+");
            res.setHeader("Pragma", "no-cache");
            SecureRandom random = new SecureRandom();
            res.setHeader("Etag", new BigInteger(130, random).toString(32));
            res.setDateHeader("Date", new Date().getTime());
            res.setDateHeader("Last-Modified", (new Date()).getTime());
            res.setHeader("Cache-Control", "no-cache,no-store,max-age=0");
            res.setHeader("Content-disposition", "inline; filename=\"SignApplet"+new Date().getTime()+".jnlp\"");

1 个答案:

答案 0 :(得分:0)

我已经解决了,但我不知道究竟是什么伎俩 我已经将jnlp创建移动到jsp页面,只是为了更容易操作它 我工作的地方更多是在jnlp标签中,围绕代码库和href 附上生成的jnlp文件

<jnlp spec="1.0+" codebase="https://ddd-003.trustitalia.it/Server/servlet/" href="" >
 <information>
    <title>SA</title>
    <vendor>FOO</vendor>
    <homepage href="https://ddd-003:8181/Server/Applets/www.foo.it"/>
    <description>Applet</description>
    <description kind="short">SA</description>
 </information>
 <security>
    <all-permissions/>
 </security>
 <update check="always" policy="always"/>
 <resources>
    <java java-vm-args="-Djava.security.policy=applet.policy" version="1.6+"/>
    <jar href="https://dddd-003.foo.it:8181/Server/Applets/SA.jar" download="eager" main="true"/>
 </resources>
 <applet-desc name="SA" main-class="com.foo.sign.applet.SPRemote" width="1004" height="80">
    <param name="fileHandler" value="20170404195941440076"/>
    <param name="timestampId" value="default"/>
    .....
    <param name="layoutType" value="ORIZ"/>
 </applet-desc>
</jnlp>

似乎唯一有效的方法是将href属性留空,然后进入codebase不只是主机而且还有上下文路径(不是servlet名称)

希望这会有所帮助