java - 使用 JNDI 配置 Tomcat 8 和 Shiro

标签 java tomcat jndi tomcat8 shiro

我想配置 Apache Shiro 使用 JNDI 来验证用户。 我配置了shiro.ini

[main]
shiro.loginUrl = /authentication/login.xhtml
dataSource = org.apache.shiro.jndi.JndiObjectFactory
dataSource.requiredType = javax.sql.DataSource
dataSource.resourceName = jdbc/sqliteDB
dataSource.resourceRef = true
jdbcRealm = com.web.authentication.JdbcRealm
jdbcRealm.dataSource = $dataSource
jdbcRealm.permissionsLookupEnabled = true
securityManager.realm = $jdbcRealm

我在 WEB-INF/web.xml 中添加了这些行:

<resource-ref>
        <description>postgreSQL Datasource example</description>
        <res-ref-name>jdbc/sqliteDB</res-ref-name>
        <res-type>javax.sql.DataSource</res-type>
        <res-auth>Container</res-auth>
    </resource-ref>

Tomcat/conf/context.xml

<Server port="8009" shutdown="SHUTDOWN">
     ..................
    <Resource auth="Container" 
    driverClassName="org.sqlite.JDBC" 
    factory="org.apache.tomcat.jdbc.pool.DataSourceFactory" 
    maxIdle="2" maxTotal="60" 
    name="java:comp/env/jdbc/sqliteDB" 
    password="" 
    type="javax.sql.DataSource" 
    url="jdbc:sqlite:/C:/sqlite/test.sqlite" 
    username="" 
    validationQuery="select sqlite_version();"/>
    .......................
      </Host>
    </Engine>
  </Service>
</Server>

但是当我部署包时出现错误:

 java.lang.IllegalStateException: Unable to look up javax.sql.DataSource with jndi name 'jdbc/sqliteDB'.
    at org.apache.shiro.jndi.JndiObjectFactory.getInstance(JndiObjectFactory.java:44)
    at org.apache.shiro.config.ReflectionBuilder.resolveReference(ReflectionBuilder.java:417)
Caused by: javax.naming.NameNotFoundException: Name [jdbc/sqliteDB] is not bound in this Context. Unable to find [jdbc].
    at org.apache.naming.NamingContext.lookup(NamingContext.java:816)
    at org.apache.naming.NamingContext.lookup(NamingContext.java:173)

你能给我一些建议,我该如何解决这个问题?

最佳答案

请尝试将 context.xml 中的 name="java:comp/env/jdbc/sqliteDB" 行更改为 name="jdbc/sqliteDB"

关于java - 使用 JNDI 配置 Tomcat 8 和 Shiro,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44613848/

相关文章:

java - 在 Android 中运行线程时避免多次点击按钮

java - 如何使用 Java 文本字段作为类名的输入?

java - 通过 IntelliJ Idea 在 Tomcat 中部署外部 war

java - 如何获得现有的 JMS 队列?

java - 如何使用 Spring Webflux 和 Tomcat 调试已发布的连接?

java - 上次编译的警告 - 无法读取文本文件/查找目录

tomcat - 如何将 Grails 3 应用程序标记为可分发?

java - 在部署 Java Web 应用程序时如何知道 .properties 文件的位置以读取配置?

java - 在 servlet 的 init 参数中进行 JNDI 查找是个好主意吗?

maven-2 - 我如何配置 JNDI 查找的模块和应用程序名称