You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 03:35:57