在调用java.awt.image.RenderedImage类的getWidth()方法时获取java.security.AccessControlException

时间:2015-10-09 14:45:17

标签: java security applet awt jai

在调用java.awt.image.RenderedImage类的getWidth()方法时获取java.security.AccessControlException。

导致问题的代码

var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
    if (xhttp.readyState == 4 && xhttp.status == 200) {
        console.log(xhttp.responseText);
    }
}
xhttp.open('GET', 'https://mandrillapp.com/api/1.0/messages/send.json?message[from_email]=mail@7995.by&message[to][0][email]=zdanevich.vitaly@yaa.ru&message[subject]=Заявка%20с%207995.by&message[html]=xxxxxx&key=oxddROOvCpKCp6InvVDqiGw', true);
xhttp.send();

在上面的代码中,this.image的类型为java.awt.image.RenderedImage class

完整堆栈跟踪

java.security.AccessControlException: access denied ("java.lang.RuntimePermission" "accessClassInPackage.com.sun.media.jai.util")
    at java.security.AccessControlContext.checkPermission(Unknown Source)
    at java.security.AccessController.checkPermission(Unknown Source)
    at java.lang.SecurityManager.checkPermission(Unknown Source)
    at java.lang.SecurityManager.checkPackageAccess(Unknown Source)
    at sun.plugin2.applet.SecurityManagerHelper.checkPackageAccessHelper(Unknown Source)
    at sun.plugin2.applet.AWTAppletSecurityManager.checkPackageAccess(Unknown Source)
    at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(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 javax.media.jai.ScaleOpImage.layoutHelper(ScaleOpImage.java:228)
    at javax.media.jai.ScaleOpImage.(ScaleOpImage.java:437)
    at com.sun.media.jai.opimage.ScaleNearestBinaryOpImage.(ScaleNearestBinaryOpImage.java:77)
    at com.sun.media.jai.opimage.ScaleCRIF.create(ScaleCRIF.java:123)
    ... 33 more

注意:

我已将以下行添加到我的java.policy文件

new Dimension(this.image.getWidth(), this.image.getHeight())

仍然没有用。有人遇到过这个问题吗?我在jre版本1.8.0_45上运行applet

更新

如果我们将以下条目添加到java.policy文件

,相同的代码将与Java 7一起正常工作
 permission java.lang.RuntimePermission "accessClassInPackage.*";
 permission java.lang.RuntimePermission "accessClassInPackage.com.sun.media.jai.opimage";

1 个答案:

答案 0 :(得分:0)

搞定了。以下是我已经完成的修复的详细信息

1]将permission:all-permissions添加到MANIFEST.MF:实际上我的applet jar已在其清单中有此条目。但我的罐子依赖于没有这个条目的jai-core,jai-imageio和jai-codec罐子。所以我使用maven shade插件生成了一个超级jar,这样我的applet jar及其所有依赖项将打包在一个jar中,并引用其清单,其中包含条目permission:all-permissions

2]完成第1步后,我得到了 java.security.AccessControlException: access denied ("java.lang.RuntimePermission" "accessClassInPackage.com.sun.media.jai.util")

此异常可以通过两种方式解决

a]将条目permission java.lang.RuntimePermission "accessClassInPackage.com.sun.media.jai.util";添加到java.policy文件中,该文件位于C:\Program Files\Java\jre1.8.0_45\lib\security

位置

这种方法并不是很酷,因为它需要在每个客户端系统中修改java.policy文件。所以我使用了方法b

中描述的实现PrivilegedAction的替代方法

b]通过实现PrivilegedAction,您必须实现它的run()方法。 run()方法中的所有代码都将在启用权限的情况下执行,这样您就不会获得任何AccessControlException。您识别抛出AccessControlException的代码并将该代码放在重写的run()方法中,以便代码具有必要的权限。

对于我的案例中的exaple,代码抛出了AccessControlException

graphics2d.drawRenderedImage(image, new AffineTransform());

要修复它,我在我的类中创建了一个私有类,并实现了如下所示的PrivilegedAction

 private final class DrawRenderedImage implements PrivilegedAction
{
    private Graphics2D graphics2D = null;

    public DrawRenderedImage(Graphics2D graphics)
    {
        graphics2D = graphics;
        // TODO Auto-generated constructor stub
    }

    public Object run()
    {

            graphics2D.drawRenderedImage(image, new AffineTransform());


        return new Boolean(true);
    }
}

正如您所看到的,我已经将导致问题的代码放在run方法中。现在可以调用run方法,如下所示

AccessController.doPrivileged(new DrawRenderedImage(graphics2d));

这里AccessController类将调用PrivilegedAction实例的run方法。

通过执行此操作,您不必在方法a中提到的java.policy文件中放置权限