Apache Tiles配置能否用HTTPS?生产环境80端口禁用报错处理
问题描述
我的tiles.xml示例代码如下:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE tiles-definitions PUBLIC "-//Apache Software Foundation//DTD Tiles Configuration 2.1//EN" "http://tiles.apache.org/dtds/tiles-config_2_1.dtd"> <tiles-definitions>
官方文档示例也使用上述http://开头的DTD URL。当前我使用Tomcat9搭配Liferay7.4版本,生产环境Tomcat需禁用80端口的所有入站、出站流量。禁用后应用运行时出现如下错误:
ERROR com.liferay.portletmvc4spring.DispatcherPortlet - Could not complete request org.apache.tiles.definition.DefinitionsFactoryException: I/O Error reading definitions. at org.apache.tiles.definition.digester.DigesterDefinitionsReader.read(DigesterDefinitionsReader.java:331) ~[tiles-core-3.0.8.jar:3.0.8] at org.apache.tiles.definition.dao.BaseLocaleUrlDefinitionDAO.loadDefinitionsFromResource(BaseLocaleUrlDefinitionDAO.java:150) ~[tiles-core-3.0.8.jar:3.0.8] at org.apache.tiles.definition.dao.CachingLocaleUrlDefinitionDAO.loadRawDefinitionsFromResources(CachingLocaleUrlDefinitionDAO.java:239) ~[tiles-core-3.0.8.jar:3.0.8] at org.apache.tiles.definition.dao.CachingLocaleUrlDefinitionDAO.loadRawDefinitionsFromResources(CachingLocaleUrlDefinitionDAO.java:230) ~[tiles-core-3.0.8.jar:3.0.8] at org.apache.tiles.definition.dao.CachingLocaleUrlDefinitionDAO.loadRawDefinitionsFromResources(CachingLocaleUrlDefinitionDAO.java:230) ~[tiles-core-3.0.8.jar:3.0.8] at org.apache.tiles.definition.dao.CachingLocaleUrlDefinitionDAO.loadDefinitionsFromResources(CachingLocaleUrlDefinitionDAO.java:208) ~[tiles-core-3.0.8.jar:3.0.8] at org.apache.tiles.definition.dao.CachingLocaleUrlDefinitionDAO.loadDefinitions(CachingLocaleUrlDefinitionDAO.java:197) ~[tiles-core-3.0.8.jar:3.0.8] at org.apache.tiles.definition.dao.ResolvingLocaleUrlDefinitionDAO.loadDefinitions(ResolvingLocaleUrlDefinitionDAO.java:68) ~[tiles-core-3.0.8.jar:3.0.8]
推测应用加载JSP时,Tomcat尝试从该URL动态下载定义文件,但因80端口被拦截触发异常。现咨询两个问题:
- 官方文档使用
http://的前提下,如何优雅处理该问题? - 为何并非所有使用者都会遇到类似问题?
解决方案与解释
1. 优雅处理方案
有两种可靠的方式解决这个问题:
- 使用类路径引用DTD:tiles-core jar包本身已包含对应DTD文件,直接修改
tiles.xml的DOCTYPE声明,用classpath:协议让解析器从本地jar包读取,无需网络请求:<!DOCTYPE tiles-definitions PUBLIC "-//Apache Software Foundation//DTD Tiles Configuration 2.1//EN" "classpath:/org/apache/tiles/dtds/tiles-config_2_1.dtd"> - 配置XML实体解析器:通过自定义
EntityResolver,让XML解析器优先从本地资源加载DTD。可以在Spring或Liferay的配置中指定自定义解析器,也可修改Tomcat的XML解析配置,强制禁用网络DTD请求。
2. 并非所有用户遇到问题的原因
- 网络环境限制差异:大部分生产环境不会完全禁用80端口的出站流量,Tomcat可正常下载DTD,因此无报错。
- 解析器缓存机制:多数XML解析器会自动缓存已下载的DTD文件,只要之前成功下载过一次,后续会直接使用本地缓存,不受网络限制影响。
- 本地资源优先加载:部分XML解析器默认会优先扫描类路径中的资源,tiles-core自带的DTD文件会被优先读取,而非直接发起网络请求,这类场景下不会触发报错。
内容的提问来源于stack exchange,提问作者Vrishank
相关产品推荐
相关产品推荐

