【问题标题】:MySQL Connection and CommandMySQL 连接和命令
【发布时间】:2015-07-09 01:51:34
【问题描述】:

我已经看到了 Java servlet 最初连接到 MySQL 数据库的 sn-ps 代码。在这种情况下,它通过 JDBC API 使用整个 Class.forName() 方法。但是,我还在其他地方看到,当 servlet 连接到数据库并执行命令时,它使用 Runtime.getRuntime().exec(command string)。这是两种完全不同的方法,但似乎都与数据库通信。 **后一个 servlet 是否以与前一个相同的方式连接到数据库,而我只是没有看到那部分代码?或者,servlet 与数据库通信是否只有两种不同的方式? ** 两种方法可以重合吗(一种用于设置,另一种用于常用命令)?或者,我可以根据个人喜好使用 JDBC API 或 Runtime.exec() 方法运行 SQL 命令吗?

【问题讨论】:

    标签: java mysql servlets


    【解决方案1】:

    第一个示例曾经是加载 JDBC 驱动程序所必需的,它不是从 JDBC 4.0 开始的;另见DriverManager Javadoc,它说(部分)

    应用程序不再需要使用Class.forName() 显式加载 JDBC 驱动程序。当前使用 Class.forName() 加载 JDBC 驱动程序的现有程序将继续工作而无需修改。

    第二个例子,Runtime.exec(String)(根据链接的 Javadoc)

    在单独的进程中执行指定的字符串命令。

    它不仅限于运行 MySQL 命令,但我强烈建议不要在服务器端代码中使用它 (shudder)。

    【讨论】:

    • 也许 OP 错过了 CGI
    • 感谢您的回答。不过,我必须问为什么不在服务器端代码中使用它?
    • 它在 JVM 外部以单独的进程执行。如果攻击者用一百万个请求访问该页面会发生什么?您的服务器上其他可能的攻击媒介呢?他们可以制作String 并执行任意命令吗?你确定吗?
    • 好的,谢谢!我没有这个想法。因此,最终出于学习目的,我必须在服务器中的某个位置加载驱动程序以使用数据库,但为了执行命令,我必须使用 exec() 方法,对吗?
    • 没有。 JDBC 驱动程序(从 JDBC 4.0 开始)注册自身。而ProcessBuilder 是我更喜欢的(当我需要执行“命令”时)。
    猜你喜欢
    • 2011-07-05
    • 1970-01-01
    • 2010-10-31
    • 2017-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多