当从unsigned Javascript调用时,如何获得已签名的Java Applet以执行特权操作?

签名的Java Applet与客户端上运行的普通Java应用程序具有相同的安全许可。 对于特定项目,我需要这些权限,并且我需要在JavaScript调用的情况下执行特权操作。

现在,问题是,至少对于Ubuntu中的Firefox 3(目标浏览器和平台),当通过未签名的JavaScript调用applet方法时,它会丢失其特殊权限。 由于签署JavaScript不是一种选择,我需要一种方法来解决这个限制。

实现此目的的一种方法是在applet启动时创建一个线程,并在主线程接收到JavaScript调用时调用该线程上的方法。 我已经实现了这个想法的工作原型,但我发现它有点笨拙,因为它使用了太多的reflection并且不像我想要的那样容易重复使用。

做我正在尝试做的事情有一种共同的,标准的方式吗? 而且,如果我的想法是正确的方法,你将如何以可重用的方式实现它? 我想要实现的是一个允许这种“运行方法在特权线程”事物被用于各种对象的框架。 理想的,utopic解决方案将是这样的:

// when the applet starts-up PrivilegedExecuter priv = new PrivilegedExecuter(myObject); //or MyClass.class // ... // inside a JavaScript-called method (myObject has myMethod) priv.myMethod(); // myMethod is run synchronously in a privileged thread 

使用java.security.AccessController类。

有一个doPrivilegedAction和doPrivilegedExceptionAction可以完全满足你的需要。

例如:

 AccessController.doPrivileged(new PrivilegedAction(){
             public Object run(){
                ..做一些只适用于签名小程序的东西..
             }
         });

值得补充的是:让你的privaction’d run()方法尽可能小而且自包含。 显然你可以让你的签名applet的init()方法调用特权run() ,然后执行实际的applet,但这只是乞求被滥用,被误用或被彻底利用。

此外,签名小程序在被JavaScript调用时失去其特殊权限这一事实并非特定于特定浏览器或平台。 这就是它,无论何时何地,它都是如此。