2011-03-06 70 views
1

我爲RMI寫了一個簡單的Hello世界程序。當客戶端在控制檯中時,它運行良好。 我嘗試使用Swing應用程序作爲我的客戶端,即使這樣,它也能正常工作。爲什麼從applet使用RMI時會出現AccessControlException?

但是當我使用一個applet作爲客戶端,它拋出以下異常:

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) 

爲什麼會這樣,我能做些什麼來讓我的工作方案?

回答

3

看看this link可能給你的信息,你需要解決這個問題:

所有的applet與安全管理器調用的應用程序 必須 授予明確的權限 訪問本地系統資源除了 從對該目錄的讀取訪問和 的子目錄中調用程序 。 Java平臺提供了 權限,允許各級對本地 信息進行不同級別的訪問。

有關不同權限和策略文件的更多詳細信息,請參閱上面的鏈接。

+0

不是用安全管理器調用的swing應用程序嗎? – shahensha 2011-03-06 10:35:06

+1

@Shahensha:不,除非你自己定義了一個。例如,在http://download.oracle.com/javase/tutorial/essential/environment/security.html上,您會看到:*通常,一個Web小應用程序與由瀏覽器或Java Web Start插件提供的安全管理器一起運行。其他類型的應用程序通常在沒有安全管理器的情況下運行,除非應用程序自己定義一個。如果沒有安全管理員,則應用程序沒有安全策略,並且沒有任何限制。* – Nailuj 2011-03-06 10:41:16

+0

RMI檢查您是否有安全管理器(儘管存在安全管理器並不意味着安全) 。 – 2011-03-08 13:25:00

2

對於小程序,網絡訪問的簡單安全規則是:它有權連接它來自的遠程服務器,但沒有別的。

因此,您必須在同一個服務器上運行RMI註冊表,該服務器也是小程序所駐留的Web服務器。

+1

或簽署小程序。 – EJP 2011-03-07 01:58:51

+0

「它有權連接它來自的遠程服務器」。正確。主機和端口號必須相同。 – 2011-08-23 12:36:43

+1

@Pierre:實際上,端口號可以不同。我有從端口80(HTTP)加載的[小程序](http://www.fencing-game.de/),但隨後在端口7777(自定義協議)上打開連接。而且RMI通常也位於另一個端口上,而不是HTTP(如果您沒有阻止RMI端口並且必須執行HTTP隧道傳輸的防火牆)。 – 2011-08-23 12:56:45

相關問題