签名的Java小程序在Safari中没有获得权限

我有一个签名的java applet(使用自签名证书),它必须访问用户的文件系统。 我必须这样做,所以请不要回复“你不应该这样做”:)

问题是,当我从Firefox 3.0 / Mac执行Applet时,一切都按预期工作,我得到了所有访问权限。

当我使用Safar 4 / Mac时,我无法访问。 我特别遇到的问题是System.getProperty()(尽管当我把它存根时,FS访问也不起作用)

String home = System.getProperty("user.home"); 

我得到的例外情况如下:

 java.security.AccessControlException: access denied (java.util.PropertyPermission user.home read) at java.security.AccessControlContext.checkPermission(AccessControlContext.java:264) at java.security.AccessController.checkPermission(AccessController.java:427) at java.lang.SecurityManager.checkPermission(SecurityManager.java:532) at java.lang.SecurityManager.checkPropertyAccess(SecurityManager.java:1285) at java.lang.System.getProperty(System.java:628) at de.samedi.searcher.Searcher.(Searcher.java:49) at de.samedi.searcher.Applet.getSearcher(Applet.java:193) at de.samedi.searcher.Applet.getSearcher(Applet.java:187) at de.samedi.searcher.Applet.addPatient(Applet.java:68) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:585) at sun.plugin.javascript.invoke.JSInvoke.invoke(JSInvoke.java:19) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:585) at sun.plugin.javascript.JSClassLoader.invoke(JSClassLoader.java:44) at sun.plugin.liveconnect.PrivilegedCallMethodAction.run(SecureInvocation.java:658) at java.security.AccessController.doPrivileged(Native Method) at sun.plugin.liveconnect.SecureInvocation$2.run(SecureInvocation.java:214) at java.security.AccessController.doPrivileged(Native Method) at sun.plugin.liveconnect.SecureInvocation.CallMethod(SecureInvocation.java:192) at sun.plugin.liveconnect.SecureInvocation.access$300(SecureInvocation.java:52) at sun.plugin.liveconnect.SecureInvocation$CallMethodThread.run(SecureInvocation.java:123) 

正如我所说,这适用于Firefox。 今天要检查Windows浏览器…

有任何想法吗?

编译并签署jar后,应运行-verify选项以确保其正确签名。

如果validation正常,请查看浏览器上已安装的证书。 我没有在Safari只有IE中做过任何事情,但我想有一个类似于IE的地方,你至少可以查看已安装的证书。 我会validation证书已安装。

还要确保您的代码在特权块中运行。

  String home = System.getProperty("user.home"); 

将始终抛出1.4或更高的错误。 除非您为所有权限编辑了java.policy文件

尝试将此与您签名的jar一起使用。

  String home = (String) AccessController.doPrivileged(new PrivilegedAction() { public Object run() { return System.getProperty("user.home"); } }); 

用户是否已接受Safari中applet的完全访问权限? 听起来像是安全经理。

我记得在旧版本的Safari(这是几年前)中遇到了类似的问题,我找到的解决方案是给applet增加了一个延迟。 似乎Safari出于某种原因允许applet在用户被给予“信任此applet”对话之前运行(其他浏览器在用户被授予或拒绝访问之前不会启动applet)。 此时applet不受信任,并且会发生安全exception。 即使用户随后允许信任,但由于applet已经运行并且失败,因此为时已晚。 我不得不为safari添加一个延迟,因此它不会尝试做任何需要安全访问的事情,直到一段时间过去,允许用户在applet尝试做任何需要安全访问的事情之前提供访问权限。