2011-09-06 83 views
0

我有一個Java小應用程序查詢Oracle數據庫的數據。從IDE內部運行時,它的功能很好。但是,當我運行它嵌入在網頁中的小程序,我得到的類加載器「訪問被拒絕」的錯誤,我一點都不知道的概念它是什麼,需要我的:從瀏覽器小應用程序使用JDBC時出現「拒絕訪問」

Sep 06, 2011 12:58:48 PM oracle.jdbc.driver.OracleDriver registerMBeans 
WARNING: Error while registering Oracle JDBC Diagnosability MBean. 
java.security.AccessControlException: access denied ("java.lang.RuntimePermission" "getClassLoader") 
       at java.security.AccessControlContext.checkPermission(Unknown Source) 
       at java.security.AccessController.checkPermission(Unknown Source) 
       at java.lang.SecurityManager.checkPermission(Unknown Source) 
       at java.lang.Thread.getContextClassLoader(Unknown Source) 
       at oracle.jdbc.driver.ClassRef.<init>(ClassRef.java:75) 
       at oracle.jdbc.driver.ClassRef.newInstance(ClassRef.java:51) 
       at oracle.jdbc.driver.OracleDriver.registerMBeans(OracleDriver.java:311) 
       at oracle.jdbc.driver.OracleDriver$1.run(OracleDriver.java:199) 
       at java.security.AccessController.doPrivileged(Native Method) 
       at oracle.jdbc.driver.OracleDriver.<clinit>(OracleDriver.java:195) 
       at java.lang.Class.forName0(Native Method) 
       at java.lang.Class.forName(Unknown Source) 
       at com.binderton.oracle.ConnectionManager.open(ConnectionManager.java:17) 
       at com.sun.javafx.applet.FXApplet2$2.run(Unknown Source) 
       at com.sun.javafx.application.PlatformImpl$3.run(Unknown Source) 
       at com.sun.glass.ui.win.WinApplication._runLoop(Native Method) 
       at com.sun.glass.ui.win.WinApplication.access$100(Unknown Source) 
       at com.sun.glass.ui.win.WinApplication$1$1.run(Unknown Source) 
       at java.lang.Thread.run(Unknown Source) 
java.lang.ExceptionInInitializerError 
       at java.lang.Class.forName0(Native Method) 
       at java.lang.Class.forName(Unknown Source) 
       at com.binderton.oracle.ConnectionManager.open(ConnectionManager.java:17) 
       at com.sun.javafx.applet.FXApplet2$2.run(Unknown Source) 
       at com.sun.javafx.application.PlatformImpl$3.run(Unknown Source) 
       at com.sun.glass.ui.win.WinApplication._runLoop(Native Method) 
       at com.sun.glass.ui.win.WinApplication.access$100(Unknown Source) 
       at com.sun.glass.ui.win.WinApplication$1$1.run(Unknown Source) 
       at java.lang.Thread.run(Unknown Source) 
Caused by: java.security.AccessControlException: access denied ("java.lang.RuntimePermission" getClassLoader") 
       at java.security.AccessControlContext.checkPermission(Unknown Source) 
       at java.security.AccessController.checkPermission(Unknown Source) 
       at java.lang.SecurityManager.checkPermission(Unknown Source) 
       at java.lang.Thread.getContextClassLoader(Unknown Source) 
       at oracle.jdbc.driver.ClassRef.<init>(ClassRef.java:75) 
       at oracle.jdbc.driver.ClassRef.newInstance(ClassRef.java:51) 
       at oracle.jdbc.driver.OracleDriver.<clinit>(OracleDriver.java:260) 
       ... 12 more 
Got ErrorEvent[url=null label=Failed to start application. cause=null 

回答

5

小程序運行在具有非常嚴格的安全規則的環境中。您至少需要sign您的小程序。

但是,這裏的問題更大,在一個applet中做JDBC是一個非常糟糕的主意。小程序的源代碼是公開可用的,因此對於簡單的黑客行爲非常敏感。你應該真的爲它創建一個web服務,然後讓你的applet訪問該web服務。通過web服務,您的applet只需通過HTTP請求/響應即可與數據庫交換信息。通過web服務,您可以隱藏公開的DB訪問詳細信息,JDBC和SQL代碼。

如何創建一個web服務取決於服務器環境和使用的編程語言。例如,在Java EE中,您可能已經爲此使用了一個簡單的Servlet,但JAX-RS和JAX-WS分別支持寧靜(XML/JSON)和XML Web服務。一個applet沒有任何安全限制,允許連接其主機的地址是getCodeBase() E.g.

InputStream response = new URL(getCodeBase(), "servlet?foo=bar").openStream(); 
// ... 
+2

對使用​​webservice與數據庫進行交互不能達成一致。你會得到兩件很酷的東西。首先,通過不將數據庫暴露給世界來保護數據(這幾乎總是一件好事)。其次,當您決定創建替代客戶端或替代品時,您不必重寫所有數據庫代碼 - 只需從新客戶端調用Web服務即可。 – corsiKa

1

請注意,如果你按照BalusC的意見和隱藏DB後面的活動頁面(例如一個servlet,PHP,ASP等)是同一臺服務器上的小程序,小程序最有可能仍然是沙箱。這將是嘗試訪問類加載器(以及數據庫)的活動頁面。

相關問題