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

Java Servlet返回HTML文件时抛出异常问题求助

解决Servlet转发静态资源导致StackOverflowError的问题

嘿,我刚仔细看了你的问题和排查结果,其实你遇到的是一个非常典型的请求转发无限循环问题,并不是缺少Jar包导致的!

问题原因分析

当你把Servlet的<url-pattern>设置为/时,这个Servlet就会成为Web应用的默认Servlet。在Tomcat这类Servlet容器中,默认Servlet的作用是处理所有其他已映射Servlet都不匹配的请求——包括静态资源(比如你的index.html)。

当你的LoginServlet执行request.getRequestDispatcher("index.html").forward(request, response)时,容器会尝试寻找能处理index.html请求的组件。这时候因为你的LoginServlet是默认Servlet,容器会把这个请求再次交给它处理,于是就陷入了无限转发循环:LoginServlet.doGet → 转发到index.html → 容器再次调用LoginServlet.doGet → 再次转发……最终导致StackOverflowError(从你提供的Eclipse异常堆栈里也能清楚看到,forward和doGet一直在重复调用)。

解决方案

你自己找到的修改<url-pattern>为/login的方案完全正确!

修改后的映射配置:

<servlet-mapping>
    <servlet-name>Login</servlet-name>
    <url-pattern>/login</url-pattern>
</servlet-mapping>

这时候你的LoginServlet只会处理路径为/login的请求,而静态资源(比如index.html)的请求会由Tomcat自带的默认Servlet(org.apache.catalina.servlets.DefaultServlet)来处理。当你在doGet里转发到index.html时,容器会正确找到处理静态资源的默认Servlet,不会再触发你的LoginServlet,循环也就终止了。

如果之后你有特殊需求,需要自定义默认Servlet同时能转发静态资源,可以通过getServletContext().getNamedDispatcher("default")获取容器自带的默认Servlet来处理静态资源请求,但对于你的新手场景来说,修改URL映射路径是最简单直接的解决方式。

内容的提问来源于stack exchange,提问作者Yyyeey

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 08:59:16