我们正在通过servlet生成JNLP,以便在JWS中运行applet . 首次下载后,缓存该文件的副本(我可以通过ControlPanel在java的临时文件中看到它) . 当我尝试下载上传的applet时,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
另一种方法是删除缓存的JNLP文件,一旦执行applet代码的init,但我不知道如何以编程方式访问缓存文件夹任何帮助欣赏
UPDATE
我忘了提到我试图以几种方式设置HttpResponse的 Headers .
最后的尝试是
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 回答
我已经解决了,但是我不知道究竟是什么把我的jnlp创建移动到了jsp页面,只是为了更容易操作它我工作的更多是在jnlp标签中,围绕代码库和href附加了结果jnlp文件
似乎唯一有效的方法是将
href
属性留空,然后进入codebase
,不仅是主机,还有上下文路径(不是servlet名称)希望这会对某人有所帮助