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
相关产品推荐
相关产品推荐

