【问题标题】:MySQL ExceptionInInitializerError Java JDBC on Startup启动时的 MySQL ExceptionInInitializerError Java JDBC
【发布时间】:2012-12-17 02:34:52
【问题描述】:

我正在制作一个使用 SQL 数据库的简单小程序。
当我在 Netbeans 上本地使用这个小程序时,它运行良好,没有问题,但是当我将它部署到 Web 时,我遇到了一个奇怪的错误。
我在本地使用 Java 1.6,而我部署的服务器正在运行 Java 1.6
我正在使用 J2BC 5.1.22。
这是我得到的错误:

java.lang.ExceptionInInitializerError
at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:315)
at java.sql.DriverManager.getConnection(Unknown Source)
at java.sql.DriverManager.getConnection(Unknown Source)
at FinalProject.DBConnect.<init>(DBConnect.java:29)
at FinalProject.TriviaApplet.init(TriviaApplet.java:61)
at com.sun.deploy.uitoolkit.impl.awt.AWTAppletAdapter.init(Unknown Source)
at sun.plugin2.applet.Plugin2Manager$AppletExecutionRunnable.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
    Caused by: java.security.AccessControlException: access denied
    ("java.util.PropertyPermission" "file.encoding" "read")
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.checkPropertyAccess(Unknown Source)
at java.lang.System.getProperty(Unknown Source)
at com.mysql.jdbc.StringUtils.<clinit>(StringUtils.java:70)

我用来初始化驱动的代码是:

        Class.forName("com.mysql.jdbc.Driver");
        connection = DriverManager.getConnection(connectionURL, "db", "pw");

有没有人知道为什么会发生这种情况?

补充一点,我的小程序从另一个类中获取所有信息。 ^ 以上来自 DBConnect 类。创建了这个类的一个实例,这个类完成了所有的数据库工作。 这是作为小程序完成的要求。 我已经签署了我的 jar 和包含 JDBC 驱动程序的 lib jar。

【问题讨论】:

  • “拒绝访问” - 权限...
  • 我确实有我的 Applet Jar 文件的签名。 (没有对lib文件签名)
  • 你为什么首先在小程序中执行 JDBC?究竟是什么让你选择了这种非常不安全的方法?您以这种方式将数据库登录名和方案公开。您应该只在服务器端执行 JDBC,由一些 servlet 或 web 服务介导。
  • 1) 小程序不能直接访问数据库,而是通过一个接口来调节它的作用。 2) 如果小程序正在向数据库或接口“打电话回家”,则小程序可以被沙盒化,但它需要从(相对于)小程序的文档库或代码库形成connectionURL。除此之外,有必要对小程序进行数字签名,以访问外部服务器。 3) 为了尽快获得更好的帮助,请发帖SSCCE
  • “没有对 lib 文件签名” 在受信任的小程序中 所有 jar 都需要进行数字签名(除非使用 JWS 部署,未签名的 Jars 在单独的扩展中)。

标签: java database security jdbc applet


【解决方案1】:

这是由于网络安全问题。您的 JDBC 驱动程序如何部署到客户端?你给他们足够的许可吗?事实上,在applet中使用JDBC访问数据库是无值的。

  1. 要求所有客户端都必须安装JRE,并且CLASSPATH中有JDBC驱动,你可以尝试将JDBC驱动和​​你的applet打包在同一个JAR中。

  2. 需要通过在每个本地 JRE 中授予套接字连接来修改策略。

permission java.net.SocketPermission "10.6.1.16:1521", "connect, resolve";

这使得这个解决方案几乎毫无用处..

【讨论】:

  • 我只是将 JDBC jar 文件移动到了我的 jar 文件所在的 lib 文件夹中。我需要对 Driver jar 文件执行更多操作吗?
  • 一旦远程用户访问您的网站,他如何从您的网络主机获取 JDBC 驱动程序?该文件将不会被下载!
  • 如果我尝试通过HTTP地址访问驱动可以访问。
  • 这只是因为 JDCB jar 文件在您的测试机器的类路径中。尝试使用干净的并远程访问它。
  • 我不确定你在问什么?
猜你喜欢
  • 2012-08-11
  • 2018-04-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-22
  • 2018-12-07
  • 1970-01-01
  • 2011-02-17
相关资源
最近更新 更多