Tomcat 9.0.67中<%@ include部分场景失效问题求助
Tomcat 9 新版多层JSP静态Include路径报错问题分析及修复
问题根源
这不是Tomcat的Bug,而是Tomcat 9.0.65及后续版本对JSP静态include(<%@ include %>)的路径解析逻辑做了严格规范。在9.0.64及更早版本中,多层嵌套静态include的路径会基于当前JSP的物理路径解析;而新版改为基于编译时顶层JSP的路径计算相对路径,导致多层嵌套场景下路径匹配错误,出现文件找不到的异常。
修复方案
- 改用绝对路径:将静态include的相对路径替换为基于Web应用根目录的绝对路径。例如把
<%@ include file="include/content.jsp"%>修改为<%@ include file="/WEB-INF/views/manager/content/include/content.jsp"%>,彻底避免路径解析歧义。 - 调整嵌套层级或文件位置:如果多层嵌套无法避免,确保每一层的include路径都严格对应当前JSP的相对位置;或者将被include的公共文件移到上层目录,减少嵌套层级,简化路径计算。
- 临时回退版本:若暂时无法修改代码,可先回退到Tomcat 9.0.64版本,保证系统正常运行,待完成代码调整后再升级。
- 修改配置恢复旧逻辑(不推荐):在Tomcat的
conf/web.xml中找到jspServlet的配置,添加初始化参数:
该配置会恢复旧的路径解析逻辑,但可能引入路径安全风险,需谨慎使用。<init-param> <param-name>org.apache.jasper.Constants.USE_RELATIVE_PATH_FOR_INCLUDE</param-name> <param-value>true</param-value> </init-param>
关于jsp:include的说明
<jsp:include>属于动态include,路径解析基于运行时的请求路径,因此不会出现文件找不到的问题,但它是在运行时加载目标页面,目标页面无法直接访问当前JSP的模型数据(静态include是编译时合并代码,模型数据天然共享)。如果需要共享模型数据,仍需使用静态include并修正路径。
内容的提问来源于stack exchange,提问作者A.G.
相关产品推荐
相关产品推荐

