Tomcat 9 配置指定Web应用远程访问权限(部署后不失效)
Tomcat 9 应用访问权限隔离的稳定配置方案
配置目标
- app1 对所有外部网络开放访问
- app2 仅允许本机回环地址访问,供app1内部服务调用
- 所有自定义配置与war包部署流程解耦,重新部署应用后不会失效
常见失效方案的根因
- 手动修改webapps目录下app2内置的context.xml:每次重新部署war包时,Tomcat会解压war包覆盖webapps下的应用目录,手动添加的配置会被直接冲掉
- 把访问限制Valve加到全局
conf/context.xml中:全局配置对所有web应用生效,会把app1的外部访问入口一起拦截 - 在
conf/Catalina/localhost路径下写自定义上下文配置时,因目录缺失、权限不足,Tomcat无法创建路径、读取配置文件,触发启动报错,所有自定义规则不会生效
落地配置步骤
1. 修复主机配置目录的基础权限
先解决启动时「无法创建conf/Catalina/localhost目录」的报错,这是之前自定义配置不生效的核心障碍:
- 手动创建默认虚拟主机的上下文配置目录:
mkdir -p $CATALINA_BASE/conf/Catalina/localhost - 给运行Tomcat的进程用户授予该目录的读写权限(Ubuntu环境下默认Tomcat运行用户为
tomcat):chown -R tomcat:tomcat $CATALINA_BASE/conf/Catalina
该目录是Tomcat存储主机级上下文配置的专属路径,和webapps下的应用文件完全分离,存放在这个路径下的配置文件,不会被war包重新部署、解压覆盖的操作影响。
2. 配置app2的本地访问限制
在上述已创建的目录下新建app2.xml文件(文件名必须和webapps下app2的目录名完全一致,和应用的上下文路径对应),写入仅允许本机访问的Valve规则:
<Context> <!-- 仅放行本机回环来源的请求,拦截所有外部访问 --> <Valve className="org.apache.catalina.valves.RemoteAddrValve" allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" /> </Context>
配置说明:
- 使用Tomcat内置的RemoteAddrValve做来源IP匹配,规则放行IPv4、IPv6的本地回环地址,其余来源的访问请求会直接返回403
- 该位置的配置优先级高于war包内部的META-INF/context.xml,不需要额外添加
override="true"参数,Tomcat会自动以该配置为准加载app2的上下文 - 无论后续怎么重新部署app2的war包,这个访问限制规则都会持续生效
3. app1的访问规则
app1默认对所有来源开放访问,不需要额外添加自定义配置,只要目录权限修复完成,Tomcat就会正常加载app1的应用入口,不会拦截外部请求。
生效验证
重启Tomcat服务加载配置后,依次完成三项校验:
- 本机执行
curl http://localhost:8080/app2,确认app2可正常响应 - 外部网络访问
http://[服务器公网IP]:8080/app1,确认app1可正常加载 - 外部网络访问
http://[服务器公网IP]:8080/app2,确认返回403禁止访问的响应
内容的提问来源于stack exchange,提问作者Sridhar Patnaik
相关产品推荐
相关产品推荐

