java.policy与catalina.policy的区别及全局权限配置问题
java.policy与catalina.policy核心区别
- 作用域不同
java.policy是JDK层全局策略文件,对该JDK启动的所有Java进程默认生效;catalina.policy是Tomcat实例专属策略文件,仅作用于当前启动的Tomcat实例。 - 加载优先级不同
Tomcat启用安全管理器时,默认启动参数带-Djava.security.policy==$CATALINA_BASE/conf/catalina.policy,双等号==代表完全以catalina.policy作为唯一策略文件,直接忽略JDK默认的java.policy配置,这是之前配置不生效的核心原因。 - 适配场景不同
catalina.policy针对Tomcat的分层类加载机制做了专属适配,内置了Tomcat核心组件、公共类库、各Web应用独立的权限域,规则粒度更适配Tomcat运行架构;java.policy是通用Java安全策略配置,没有针对Web容器的类加载层级做特殊设计。
配置java.policy实现全局权限生效的操作步骤
- 修改Tomcat启动参数
找到对应Tomcat实例的bin/catalina.sh(Linux)或bin/catalina.bat(Windows)文件,修改安全管理器相关的启动参数:
- 若需要catalina.policy和java.policy规则叠加生效,将参数中的双等号
==改为单等号=,修改后示例:-Djava.security.policy=$CATALINA_BASE/conf/catalina.policy - 若需要完全弃用所有catalina.policy配置,仅用全局java.policy,直接删除该启动参数即可。
- 编写java.policy权限规则
打开JDK安装路径下的jre/lib/security/java.policy文件,添加对应权限规则即可:
示例1:给所有Tomcat实例下的所有Web应用授权访问指定外部目录的权限
grant codeBase "file:*/webapps/-" { permission java.io.FilePermission "/你的外部文件目录/-", "read,write"; };
示例2:给指定名称的Web应用授权
grant codeBase "file:*/webapps/你的应用名/-" { permission java.io.FilePermission "/你的外部文件目录/-", "read,write"; };
- 重启所有Tomcat实例验证即可。
内容的提问来源于stack exchange,提问作者udaikp
相关产品推荐
相关产品推荐

