Почему я получаю AccessControlException при использовании RMI из апплета? - PullRequest
1 голос
/ 06 марта 2011

Я написал простую программу Hello world для RMI. Это хорошо работает, когда клиент находится в консоли. Я пытался использовать приложение Swing в качестве моего клиента, оно работало нормально даже тогда.

Но когда я использую апплет в качестве клиента, он выдает следующее исключение:

Exception in thread "AWT-EventQueue-1" java.security.AccessControlException: access denied (java.net.SocketPermission 127.0.0.1:1099 connect,resolve)
        at java.security.AccessControlContext.checkPermission(AccessControlContext.java:323)
        at java.security.AccessController.checkPermission(AccessController.java:546)
        at java.lang.SecurityManager.checkPermission(SecurityManager.java:532)
        at java.lang.SecurityManager.checkConnect(SecurityManager.java:1034)
        at java.net.Socket.connect(Socket.java:524)
        at java.net.Socket.connect(Socket.java:478)
        at java.net.Socket.<init>(Socket.java:375)
        at java.net.Socket.<init>(Socket.java:189)
        at sun.rmi.transport.proxy.RMIDirectSocketFactory.createSocket(RMIDirectSocketFactory.java:22)
        at sun.rmi.transport.proxy.RMIMasterSocketFactory.createSocket(RMIMasterSocketFactory.java:128)
        at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:595)
        at sun.rmi.transport.tcp.TCPChannel.createConnection(TCPChannel.java:198)
        at sun.rmi.transport.tcp.TCPChannel.newConnection(TCPChannel.java:184)
        at sun.rmi.server.UnicastRef.newCall(UnicastRef.java:322)
        at sun.rmi.registry.RegistryImpl_Stub.lookup(Unknown Source)
        at java.rmi.Naming.lookup(Naming.java:84)
        at Client.<init>(Client.java:23)
        at MyApplet.submitActionPerformed(MyApplet.java:179)
        at MyApplet.access$300(MyApplet.java:22)
        at MyApplet$4.actionPerformed(MyApplet.java:84)
        at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)
        at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)
        at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
        at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
        at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
        at java.awt.Component.processMouseEvent(Component.java:6263)
        at javax.swing.JComponent.processMouseEvent(JComponent.java:3267)
        at java.awt.Component.processEvent(Component.java:6028)
        at java.awt.Container.processEvent(Container.java:2041)
        at java.awt.Component.dispatchEventImpl(Component.java:4630)
        at java.awt.Container.dispatchEventImpl(Container.java:2099)
        at java.awt.Component.dispatchEvent(Component.java:4460)
        at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4574)
        at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4238)
        at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4168)
        at java.awt.Container.dispatchEventImpl(Container.java:2085)
        at java.awt.Component.dispatchEvent(Component.java:4460)
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
        at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
        at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
        at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)

Почему это так, и что я могу сделать, чтобы моя программа работала?

Ответы [ 2 ]

3 голосов
/ 06 марта 2011

Посмотрите, может ли эта ссылка предоставить вам информацию, необходимую для решения этой проблемы:

Все апплеты и любые приложения вызывается с менеджером безопасности должен получить явное разрешение на доступ к локальным системным ресурсам отдельно от доступа для чтения к каталогу и его подкаталоги, где программа вызывается. Платформа Java обеспечивает разрешения, чтобы позволить различные уровни доступ к различным типам местных информация.

См. Ссылку выше для получения дополнительной информации о различных разрешениях и файле политики.

2 голосов
/ 06 марта 2011

Для апплетов простое правило безопасности для доступа к сети: у него есть разрешение на подключение к удаленному серверу, с которого он пришел, но ничего другого.

Итак, вам придется запустить реестр RMI натот же сервер, который также является веб-сервером, на котором находится апплет.

...