我在我的网络应用程序中使用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,问题仍然存在。
答案 0 :(得分:2)
如果您的Web应用程序是通过身份验证步骤访问的,则Chrome和Firefox的Java插件可能无法下载jar文件 - 当他们尝试访问applet的URL时,他们很可能会受到以下问题的欢迎:您的登录页面。你可以用Fiddler证实这一点。
此问题不会出现在IE中,因为Java插件能够使用浏览器本身持有的会话,因此applet加载器能够立即下载jar文件。
如果是这种情况,显而易见的解决方案是允许对jar文件进行未经身份验证的访问。如果您使用的是IIS,则可以通过在web.config中添加例外来完成。