我们正在通过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\"");
答案 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名称)
希望这会有所帮助