自签名(jdk 7u45)Applet在firefox和chrome上的SSL上运行时得到NullPointerException

时间:2014-02-03 14:01:21

标签: java applet nullpointerexception java-7

我在我的网络应用程序中使用applet。 我使用Oracle JDK 1.7.45 创建自签名applet jar文件并编译类。 在客户端,我使用 JRE 1.7.51 并导入证书。 当我在SSL协议上使用应用程序时,applet在三种浏览器(IE,Mozilla Firefox,Google Chrome)中运行良好。问题是当我尝试在没有SSL模式的http中使用应用程序时在chrome和Firefox浏览器中运行applet时,我得到了以下NullPointerException,但它仍然适用于IE。

java.lang.NullPointerException
    at sun.plugin2.applet.Plugin2ClassLoader.getTrustedCodeSources(Unknown Source)
    at com.sun.deploy.security.CPCallbackHandler$ParentCallback.strategy(Unknown Source)
    at com.sun.deploy.security.CPCallbackHandler$ParentCallback.openClassPathElement(Unknown Source)
    at com.sun.deploy.security.DeployURLClassPath$JarLoader.getJarFile(Unknown Source)
    at com.sun.deploy.security.DeployURLClassPath$JarLoader.access$1000(Unknown Source)
    at com.sun.deploy.security.DeployURLClassPath$JarLoader$1.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at com.sun.deploy.security.DeployURLClassPath$JarLoader.ensureOpen(Unknown Source)
    at com.sun.deploy.security.DeployURLClassPath$JarLoader.<init>(Unknown Source)
    at com.sun.deploy.security.DeployURLClassPath$3.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at com.sun.deploy.security.DeployURLClassPath.getLoader(Unknown Source)
    at com.sun.deploy.security.DeployURLClassPath.getLoader(Unknown Source)
    at com.sun.deploy.security.DeployURLClassPath.getResource(Unknown Source)
    at sun.plugin2.applet.Plugin2ClassLoader$1.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at sun.plugin2.applet.Plugin2ClassLoader.findClassHelper(Unknown Source)
    at sun.plugin2.applet.Applet2ClassLoader.findClass(Unknown Source)
    at sun.plugin2.applet.Plugin2ClassLoader.loadClass0(Unknown Source)
    at sun.plugin2.applet.Plugin2ClassLoader.loadClass(Unknown Source)
    at sun.plugin2.applet.Plugin2ClassLoader.loadClass0(Unknown Source)
    at sun.plugin2.applet.Plugin2ClassLoader.loadClass(Unknown Source)
    at sun.plugin2.applet.Plugin2ClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at sun.plugin2.applet.Plugin2ClassLoader.loadCode(Unknown Source)
    at sun.plugin2.applet.Plugin2Manager.initAppletAdapter(Unknown Source)
    at sun.plugin2.applet.Plugin2Manager$AppletExecutionRunnable.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source) 

在此链接http://www.oracle.com/technetwork/java/javase/7u45-relnotes-2016950.html中,我看到了这两个相关的7u45已知问题:

  

区域:部署/插件

     

概要:如果在禁用部署缓存时使用包压缩,则无法通过抛出NPE来加载Applet。

     

如果JAR文件正在使用带有清单条目的包压缩   部署缓存时的权限和Caller-Allowable-Codebase   禁用,然后:

     

•将忽略权限清单条目。 (这可以看出来   从安全对话甚至出现黄色警告的事实来看   虽然Permissions属性存在。)只有在这种情况下才会发生   Caller-Allowable-Codebase属性与。一起出现   权限属性。

     

•Caller-Allowable-Codebase属性将导致applet   无法通过抛出java.lang.NullPointerException来加载。

     

如果你想使用包装压缩   Caller-Allowable-Codebase属性有两种可能   变通办法:

     

•启用缓存,列出的所有问题都将消失。

     

•部署时不要使用pack属性jnlp.packEnabled = true   applet使用Caller-Allowable-Codebase和premissions属性。   而是使用ContentType servlet来提供包文件。

     

区域:部署/插件

     

概要:使用文件:\ URL无法加载非JNLP受信任的applet。不使用JNLP文件部署的本地受信任小程序将   无法通过抛出java.lang.NullPointerException来加载。您可以   通过使用以下方法之一解决此问题:

     

•使用JNLP文件启动小程序。

     

•尝试通过HTTP或HTTPS加载小程序。

但我不使用包压缩,我也使用JNLP文件来启动applet,问题仍然存在。

1 个答案:

答案 0 :(得分:2)

如果您的Web应用程序是通过身份验证步骤访问的,则Chrome和Firefox的Java插件可能无法下载jar文件 - 当他们尝试访问applet的URL时,他们很可能会受到以下问题的欢迎:您的登录页面。你可以用Fiddler证实这一点。

此问题不会出现在IE中,因为Java插件能够使用浏览器本身持有的会话,因此applet加载器能够立即下载jar文件。

如果是这种情况,显而易见的解决方案是允许对jar文件进行未经身份验证的访问。如果您使用的是IIS,则可以通过在web.config中添加例外来完成。