从浏览器applet使用JDBC时“访问被拒绝”

时间:2011-09-06 17:18:55

标签: java oracle jdbc applet

我有一个java applet,用于查询Oracle数据库中的数据。从IDE内部运行时,它运行正常。但是当我将它作为嵌入在网页中的applet运行时,我在类加载器中遇到了“访问被拒绝”错误,而且我没有最模糊的概念,它对我的​​要求是什么:

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

2 个答案:

答案 0 :(得分:5)

Applet在具有非常严格的安全规则的环境中运行。您至少需要sign您的小程序。

但是,这里的问题更大,在applet中执行JDBC是一个非常糟糕的主意。 applet的源代码是公开可用的,因此易于破解。您应该为此创建一个Web服务,然后让您的applet访问该Web服务。通过webservice,您的applet将能够通过HTTP请求/响应与DB交换信息。使用Web服务,您可以隐藏公共数据库访问详细信息,JDBC和SQL代码。

如何创建Web服务取决于服务器环境和使用的编程语言。例如,在Java EE中,您可能已经为此使用了一个简单的Servlet,但是分别支持JAX-RS和JAX-WS用于restful(XML / JSON)和XML Web服务。小程序没有任何安全限制,允许与getCodeBase()等地址可用的主机连接。

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

答案 1 :(得分:1)

请注意,如果您遵循BalusC的建议并将数据库隐藏在与上的活动页面(例如,servlet,PHP,ASP等)后面,则applet很可能仍然是沙盒子。它将是尝试访问类加载器(以及数据库)的活动页面。