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

JDK21+Tomcat9下,如何配置catalina.policy避免CompletableFuture权限异常?

解决Tomcat 9里CompletableFuture任务的权限异常问题

配置思路

Tomcat通过catalina.policy文件管控安全权限,你碰到的问题是因为CompletableFuture.supplyAsync()默认用的ForkJoinPool线程没拿到足够权限,得给你的Web应用代码添加对应的权限声明。

具体配置步骤

找到Tomcat安装目录下的conf/catalina.policy文件,添加以下配置:

1. 搞定HTTP请求的Socket权限问题

添加SocketPermission权限,允许解析和连接目标域名:

grant codeBase "file:${catalina.base}/webapps/你的应用名/-" {
    // 允许解析example.com域名,以及建立HTTPS连接(443端口)
    permission java.net.SocketPermission "example.com", "resolve,connect";
    // 如果要访问任意域名,换成"*"就行,但生产环境别这么干,风险高
    // permission java.net.SocketPermission "*", "resolve,connect";
};

2. 解决系统属性读取权限问题

添加PropertyPermission权限,允许读取OS相关的系统属性:

grant codeBase "file:${catalina.base}/webapps/你的应用名/-" {
    // 单独授权读取os.arch属性
    permission java.util.PropertyPermission "os.arch", "read";
    // 要是需要读所有OS相关属性,用"os.*"
    // permission java.util.PropertyPermission "os.*", "read";
    // 要是要读所有系统属性(谨慎用,别随便开)
    // permission java.util.PropertyPermission "*", "read";
};

合并简化配置

可以把两个权限放到同一个grant块里,省得重复写:

grant codeBase "file:${catalina.base}/webapps/你的应用名/-" {
    permission java.net.SocketPermission "example.com", "resolve,connect";
    permission java.util.PropertyPermission "os.arch", "read";
};

注意点

  • 把你的应用名换成你实际部署在Tomcat里的Web应用文件夹名称
  • 生产环境一定要遵循最小权限原则,别乱用通配符*,只给必要的域名和属性授权
  • 修改完catalina.policy必须重启Tomcat才能生效
  • 要是你的代码打包成JAR文件了,把codeBase改成对应的JAR路径就行,比如file:${catalina.base}/webapps/你的应用名/WEB-INF/lib/你的jar包.jar"

内容的提问来源于stack exchange,提问作者Avin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 13:27:05