welcome-file列表顺序决定首页加载优先级,容器按从左到右顺序查找首个存在的文件并返回;web.xml中该配置必须位于web-app根节点下,且会完全替换tomcat默认列表;spring boot嵌入式容器下web.xml不生效,需改用静态资源配置。

web.xml 里 welcome-file 列表顺序决定首页加载优先级
浏览器访问根路径(如 http://localhost:8080/)时,容器会按 welcome-file 列表从左到右依次查找文件,第一个存在的就返回,不继续往后找。顺序不是建议,是硬性规则。
常见错误现象:index.html 和 index.jsp 都在 WEB-INF/classes 同级目录下,但访问根路径却进了 JSP —— 很可能因为 index.jsp 在 welcome-file 里排得更靠前,哪怕你本意是用静态页。
-
welcome-file-list必须包含在web-app根节点下,不能嵌套错位置 - 每个
welcome-file是独立子标签,不是用逗号或空格分隔的字符串 - 文件名区分大小写,
Index.html≠index.html(尤其在 Linux 容器上) - 路径只支持相对于 WebRoot 的扁平文件名,不支持子目录如
pages/home.html
Tomcat 默认 welcome-file 列表和覆盖逻辑
Tomcat 自带默认值:index.html、index.htm、index.jsp。如果你没配 welcome-file-list,就按这个顺序查。一旦你在 web.xml 里写了任意 welcome-file-list,整个默认列表就被完全替换,不会合并。
所以想保留默认行为又加一个 home.xhtml,不能只写:
<welcome-file-list> <welcome-file>home.xhtml</welcome-file> </welcome-file-list>
这会导致连
index.html 都不认了。
- 要扩展默认行为,必须显式重写全部项:
index.html、index.htm、index.jsp、home.xhtml - 顺序仍生效:把
home.xhtml放最前,它就优先;放最后,就兜底 - Servlet 3.0+ 注解配置(如
@WebServlet(urlPatterns = "/"))不参与 welcome-file 机制,二者无交集
Spring Boot 内嵌 Tomcat 下 web.xml 不生效的典型场景
Spring Boot 默认不加载传统 web.xml,即使你把它放在 src/main/webapp/WEB-INF/ 下,只要用了 spring-boot-starter-web + 嵌入式容器,welcome-file-list 就被忽略。
此时首页逻辑由 Spring MVC 控制,常见表现是:明明 web.xml 写了 index.html,但请求根路径返回 404 或跳转到登录页。
- 验证是否生效:启动后看日志有没有类似
Initializing Spring DispatcherServlet—— 有则说明走的是 Spring 路由,web.xml已失效 - 替代方案:用
spring.web.resources.static-locations指定静态资源路径,并确保index.html在 classpath:/static/ 或 /public/ 下 - 若坚持用
web.xml,需排除spring-boot-starter-tomcat,手动引入传统 war 包部署方式,代价是失去嵌入式便利性
欢迎页找不到时的 404 和 403 错误差异定位
访问根路径返回 404,不等于 welcome-file 配置错了。先确认:目标文件是否真实存在于 webapp/(或打包后 WAR 根目录)下?路径对不对?权限读不读得?
而返回 403 更值得警惕:文件存在且路径正确,但容器拒绝提供服务。常见原因是安全约束拦截了 /index.html 这类未认证路径。
- 检查
web.xml中security-constraint的url-pattern是否意外覆盖了/index.html或/ - Tomcat 9+ 对
WEB-INF和META-INF目录强制 403,但 welcome-file 不该放这里面 —— 放了也不会报错,只是永远找不到 - 用浏览器开发者工具看 Network 面板,确认实际请求的 URL 是什么(有时重定向导致你以为在访问根路径,其实已跳去别的地址)
web.xml 本身。










