首页 文章

动态生成的JNLP在本地缓存

提问于
浏览
0

我们正在通过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 回答

  • 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名称)

    希望这会对某人有所帮助

相关问题