2015-10-09 4 views
0

Получение java.security.AccessControlException при вызове метода getWidth() класса java.awt.image.RenderedImage.Получение java.security.AccessControlException при вызове метода getWidth() класса java.awt.image.RenderedImage

код, который вызывает проблемы

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

В приведенном выше коде this.image имеет тип java.awt.image.RenderedImage класса

Полный трассировки стека

 
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 

NOTE :

Я добавил (а) в моем файле java.policy

permission java.lang.RuntimePermission "accessClassInPackage.*"; 
permission java.lang.RuntimePermission "accessClassInPackage.com.sun.media.jai.opimage"; 

Все еще это не сработало. Кто-нибудь столкнулся с этой проблемой? Я бегу апплета JRE версии 1.8.0_45

UPDATE:

же код будет работать нормально с Java 7, если мы добавим следующую запись в файл java.policy

permission java.util.PropertyPermission com.sun.media.imageio.disableCodecLib", "read"; 
+1

* «Я добавил следующие строки в мой файл java.policy» * файлы политики бесполезны, когда речь идет о для развертывания, и каждый апплет в эти дни нуждается в цифровой подписке, чтобы иметь возможность запускаться в браузере. Таким образом, я бы рекомендовал добавить функциональность в сборку, чтобы ее также подписать, и перейти оттуда (игнорируя файлы политики). –

+0

@ Андрю Томпсон Большое спасибо за ответ. Апплет, который я использую, подписан только. –

+1

* «Applet build, который я использую, подписан только». * Убедитесь, что он декларирует 'all-permissions' в манифесте, а затем файлы политики не имеют значения. –

ответ

0

Понял работает , Ниже приведены подробные сведения об исправлениях, которые я сделал

1] Добавить permission:all-permissions в MANIFEST.MF: На самом деле мой аппликатор уже имел эту запись в своем манифесте. Но у моей банки были зависимости от jai-core, jai-imageio и jai-codec jars, у которых не было этой записи. Таким образом, я создал банку uber, используя плагин maven shade, чтобы моя аппликационная банка и все ее зависимости были упакованы внутри одной банки и ссылались на ее манифест, который будет содержать запись permission:all-permissions в ее манифесте

2] После выполнения шага 1 I получал java.security.AccessControlException: access denied ("java.lang.RuntimePermission" "accessClassInPackage.com.sun.media.jai.util")

Это исключение может быть решена в 2 способами

а] при добавлении записи permission java.lang.RuntimePermission "accessClassInPackage.com.sun.media.jai.util"; в java.policy файл, который можно найти на месте C:\Program Files\Java\jre1.8.0_45\lib\security

Этот подход не так круто, как это требует modifi cation файла java.policy в каждой клиентской системе. Поэтому я использовал альтернативный подход реализации PrivilegedAction, как описано в подходе b

b] При реализации PrivilegedAction вы должны реализовать его метод run(). Весь код внутри метода run() будет выполняться с включенными привилегиями, так что вы не получите AccessControlException. Вы идентифицируете код, бросающий AccessControlException, и помещаете этот код в метод overridden 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. Теперь запустите метод может быть вызван, как показано ниже

AccessController.doPrivileged(new DrawRenderedImage(graphics2d)); 

Здесь AccessController класс будет вызывать метод запуска экземпляра PrivilegedAction.

Делая это, вы не должны положить разрешения в java.policy файла, как указано в подходе