Tomcat 10非SpringBoot应用中DataSourceRealm配置失败求助
适配Tomcat 10的DataSourceRealm配置方案
你之前的代码存在几个关键问题:变量名混用(context和ctx)、使用了Tomcat 10中废弃的setDigest方法、资源绑定步骤不完整。以下是正确的数据源绑定到StandardContext并配置DataSourceRealm的代码逻辑:
完整适配代码
import org.apache.catalina.ContextResource; import org.apache.catalina.realm.DataSourceRealm; import org.apache.catalina.realm.MessageDigestCredentialHandler; import org.apache.catalina.startup.Tomcat; import org.apache.catalina.core.StandardContext; // 初始化Tomcat实例 Tomcat tomcat = new Tomcat(); tomcat.setPort(port); StandardContext ctx = (StandardContext) tomcat.addWebapp(contextPath, docBase.getAbsolutePath()); // 1. 启用Tomcat命名服务(JNDI依赖) tomcat.enableNaming(); // 2. 创建并配置数据源资源 ContextResource dataSourceResource = new ContextResource(); dataSourceResource.setName("jdbc/test"); dataSourceResource.setType("javax.sql.DataSource"); dataSourceResource.setAuth("Container"); // 数据库连接属性 dataSourceResource.setProperty("driverClassName", "org.postgresql.Driver"); dataSourceResource.setProperty("url", "jdbc:postgresql://localhost:5432/cmt"); dataSourceResource.setProperty("username", "test"); dataSourceResource.setProperty("password", password); // 可选:连接池配置(按需调整) dataSourceResource.setProperty("maxTotal", "100"); dataSourceResource.setProperty("maxIdle", "30"); dataSourceResource.setProperty("maxWaitMillis", "10000"); // 3. 将数据源资源绑定到StandardContext的命名资源中 ctx.getNamingResources().addResource(dataSourceResource); // 4. 配置DataSourceRealm DataSourceRealm dataSourceRealm = new DataSourceRealm(); dataSourceRealm.setDataSourceName("jdbc/test"); // 对应上面的JNDI资源名称 // 数据库表字段映射配置 dataSourceRealm.setUserTable("auth_user"); dataSourceRealm.setUserNameCol("user_name"); dataSourceRealm.setUserCredCol("user_pass"); dataSourceRealm.setUserRoleTable("auth_user_roles"); dataSourceRealm.setRoleNameCol("role_name"); // 配置凭证处理器(替代废弃的setDigest方法) MessageDigestCredentialHandler credentialHandler = new MessageDigestCredentialHandler(); credentialHandler.setAlgorithm("SHA-512"); dataSourceRealm.setCredentialHandler(credentialHandler); // 5. 将Realm关联到StandardContext ctx.setRealm(dataSourceRealm); // 启动Tomcat tomcat.start();
关键步骤说明
- 启用命名服务:
tomcat.enableNaming()是核心前提,DataSourceRealm依赖JNDI查找数据源,未启用会直接导致资源找不到。 - 资源绑定上下文:必须将
ContextResource添加到当前StandardContext的NamingResources,确保Realm所在的Web上下文能访问到该JNDI资源。 - 废弃方法替换:Tomcat 10中
DataSourceRealm的setDigest已被废弃,必须通过MessageDigestCredentialHandler配置密码加密规则。 - 变量统一:全程使用同一个
StandardContext实例(代码中统一用ctx),避免之前混用变量导致的资源绑定无效。
内容的提问来源于stack exchange,提问作者balaji hari
相关产品推荐
相关产品推荐

