在调用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";
答案 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文件中放置权限