Tomcat JDCBRealm没有找到驱动程序类

时间:2016-05-26 17:28:55

标签: java tomcat jdbc intellij-idea hsqldb

我使用hsql作为我的数据库后端,我想配置JDBCRealm进行身份验证/授权。我使用Intellij进行开发和部署以及Tomcat 7。

这是我的context.xml

<Context antiJARLocking="true">
    <Realm className="org.apache.catalina.realm.JDBCRealm"
           driverName="org.hsqldb.jdbcDriver"
           connectionURL="jdbc:hsqldb:hsql://localhost"
           userTable="customers" userNameCol="username" userCredCol="password"
           userRoleTable="roles" roleNameCol="role_name"/>
</Context>

我已将hsqldb添加为库:

enter image description here

部署应用程序时,JDBCRealm找不到添加的驱动程序:

Caused by: java.lang.ClassNotFoundException: org.hsqldb.jdbcDriver
    at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:195)
    at org.apache.catalina.realm.JDBCRealm.open(JDBCRealm.java:688)

但是为了确保正确加载前面提到的类,我添加了这个片段:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        try {
            Class foo = Class.forName("org.hsqldb.jdbcDriver");
            System.out.println("This is working!");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

正如预期的那样,通过请求正确的URL导致servlet被执行,服务器打印This is working,表明正确加载了JDBCRealm未找到的类。

知道问题是什么吗? 我只有两条可能相关的线索(或可能不相关!):

  1. 我添加的某些库(包括hsql)未添加到target/WEB-INF/lib
  2. enter image description here

    但问题是:如果它没有作为库添加到目标中,那么上一个代码片段是如何工作的?

    解决方法

    虽然我不知道为什么JDBCRealm没有找到HSQLDriver,但是通过将其JAR文件复制到/var/lib/tomcat7/lib,其中catalina加载JARS的地方之一,问题得到了解决了。但对我来说,如何以标准方式解决问题仍然是个谜。

2 个答案:

答案 0 :(得分:1)

您选择的解决方案是标准方式:Realm在您的应用程序之外运行,因此它不依赖于您的应用程序引入的代码 - 它必须选择全局类路径。

如果它依赖于你的webapp中的代码,这实际上会引入一个有趣的攻击向量,你的应用程序负责自己的身份验证:不是作者的意图,因此这是你必须满足的情况对

答案 1 :(得分:1)

您的解决方法不是解决方法。 是标准方式。

请参阅JDBCRealm的文档:

  

快速入门

     

要设置Tomcat以使用JDBCRealm,您需要按照以下步骤操作:

     
      
  1. 如果您还没有这样做,请在数据库中创建符合上述要求的表和列。
  2.   
  3. 配置供Tomcat使用的数据库用户名和密码,该用户名和密码至少具有对上述表的只读权限。 (Tomcat永远不会尝试写入这些表。)
  4.   
  5. $CATALINA_HOME/lib目录中放置您将使用的JDBC驱动程序的副本。请注意,只能识别JAR文件!
  6.   
  7. <Realm>文件中设置$CATALINA_BASE/conf/server.xml元素,如下所述。
  8.   
  9. 如果Tomcat已在运行,请重新启动它。
  10.   

这是因为Realm是在webapp之外管理的,即使它只适用于单个Context。