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

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端口被拦截触发异常。现咨询两个问题:

  1. 官方文档使用http://的前提下,如何优雅处理该问题?
  2. 为何并非所有使用者都会遇到类似问题?

解决方案与解释

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 20:24:50