繁体   English   中英

如何允许我的Java applet使用MySQL?

[英]How do I permit my Java applet to use MySQL?

由于这个网站 ,我最近把我的业余爱好java项目嵌入了一个页面,但现在我遇到了一些安全问题。

我有包括:

import java.sql.*;

和行:

Class.forName("com.mysql.jdbc.Driver").newInstance();

以及我的src目录中的mysql .jar文件,它可以从控制台运行,并且在applet中可以正常工作 - 直到我的代码中的forName()行,它会抛出异常:

Exception: com.mysql.jdbc.Driverjava.lang.ClassNotFoundException: com.mysql.jdbc.Driver
    java.security.AccessControlException: access denied (java.lang.RuntimePermission exitVM.-1)
    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.checkExit(Unknown Source)
    at java.lang.Runtime.exit(Unknown Source)
    at java.lang.System.exit(Unknown Source)
    at applet.Database.connectDB(Database.java:80)
    etc...

我想我可以使用client.policy文件修复它,否则我可能需要编写一个抽象层,它使用服务器 - 客户端网络连接从服务器端查询...

我相信这里的Java大师可能知道最好的方法。

如果您尝试使用applet中的JDBC驱动程序,则需要使用证书对applet进行签名,并且在客户端加载applet时,服务器需要提供此证书。

我认为安全异常实际上来自applet中的System.exit()调用,在Class.forName()之后。 通常,您不允许在未签名的applet中调用System.exit(),因为它会关闭整个JVM。 您是否检查了第80行是否实际上是Class.forName()行,或者第80行是否有某种异常处理程序,如果驱动程序未加载,它会尝试调用System.exit()?

无论如何,为了在你的applet中加载mysql jar文件,你需要将它包含在ARCHIVE属性中,如下所示:

<APPLET ARCHIVE="mysql.jar" CODEBASE="./src/" ...

一旦超过此阶段,您仍然需要以与Web服务器相同的IP号/主机名托管mysql服务器,并将其打开给可以访问您的applet的所有相同人员。 正如托尼所说,出于安全原因,人们通常不会这样做。 如果您可以控制应用服务器,并使用XML或其他一些数据交换方法将数据输出到applet,那么最好在服务器端编写一些东西。 当然,如果您只是在尝试学习applet,那么它可能很好 - 但如果可能的话,请注意将mysql保留在防火墙后面。

可接受的方法是从加载小程序的服务器发出HTTP请求,并从服务器运行查询。 JSON或XML是在applet和服务器之间交换数据的好方法(类似于你做AJAX应用程序的方式,在浏览器和服务器之间发送XML或JSON)。

正如其他一个答案(@Leigh Caldwell)所述,我强烈建议不要这样做。 如果您的applet可以访问MySQL,那么世界上的其他人也是如此。 如今,反编译是如此微不足道,以至于只有一个勤劳的黑客才能将applet凭据提供给数据库。 此外,MySQL的用户/通过身份验证相当薄弱,其大部分安全性都是基于IP的。 通过向全世界开放,你将丢掉你的第一线。

更好的方法是在服务器端构建某种前端协议(XMLRPC将是一个很好的基础并且易于使用)。 如果applet绝对需要访问数据库,那么最好的选择就是内存中的HSQLDB 这不需要任何文件权限,可以在沙盒中完全运行。 可以根据需要使用上述XMLRPC外观将本地内存数据库与服务器同步。

尝试摆脱newInstance()部分。 我认为只有Class.forName()才能加载驱动程序。

该异常告诉您applet无法加载驱动程序类。 您的applet需要在运行时通过HTTP下载包含该类的jar,因此您必须在Web服务器上提供jar(mysql.jar或其他任何名称)。

解决此问题后,用户必须允许applet权限,以便它可以与mysql数据库服务器建立TCP套接字连接。 他们会提示一个对话框......

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM