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

Servlet调用request.getRequestDispatcher时陷入无限循环问题求助

解决启动Servlet转发时的无限循环问题

嘿,这个无限循环的坑我之前也踩过!问题出在你给Start Servlet设置的映射规则@WebServlet({"/Start", "/Start/*"})上——这个/Start/*是前缀匹配,意味着所有以/Start/开头的请求都会被这个Servlet拦截处理。

当你在Servlet里调用request.getRequestDispatcher("Done.jspx").forward(...)时,如果用的是相对路径,最终生成的请求路径会是/MyApp/Start/Done.jspx,刚好命中/Start/*的规则,于是请求又被Start Servlet接手,再次执行转发逻辑,反复循环就这么产生了。

给你几个实用的解决方案,按需选择:

1. 缩小Servlet的映射范围(最推荐)

把映射改成只精确匹配/Start,这样只有用户直接访问http://localhost:8080/MyApp/Start时才会触发这个Servlet,转发到Done.jspx的请求就不会被拦截了:

@WebServlet("/Start")

调整后,转发到Done.jspx的请求路径会是/MyApp/Done.jspx,完全不在Start Servlet的管辖范围内,循环自然就断了。

2. 给Done.jspx安排独立的路径

如果你必须保留/Start/*的映射(比如有其他子路径需求),可以把Done.jspx放到一个Servlet不会匹配的目录下,比如新建/completed目录,把Done.jspx放进去,然后转发路径写成绝对路径:

request.getRequestDispatcher("/completed/Done.jspx").forward(request, response);

这样请求路径变成/MyApp/completed/Done.jspx,不会被/Start/*匹配到,也就不会触发循环。

3. 在Servlet里加判断逻辑(兜底方案)

如果前两个方案都不适用,那可以在Servlet的处理方法里加个判断,跳过对Done.jspx请求的处理:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    String pathInfo = request.getPathInfo();
    // 检查当前请求是否是指向Done.jspx的
    if ("/Done.jspx".equals(pathInfo)) {
        // 直接让容器处理JSP,不走自己的逻辑
        request.getRequestDispatcher(pathInfo).forward(request, response);
        return;
    }
    // 原来加载Form.jspx的逻辑
    request.getRequestDispatcher("Form.jspx").forward(request, response);
}

不过这个方案有点繁琐,还是优先推荐前两种更简洁的方式。

最后提个小知识点:容器默认的JSP处理Servlet是匹配*.jsp的,但前缀匹配(比如/Start/*)的优先级比后缀匹配高,所以当你的映射覆盖了JSP路径时,就会出现自己的Servlet处理JSP请求的情况,这也是循环的核心原因~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 08:26:06