Servlet调用request.getRequestDispatcher时陷入无限循环问题求助
嘿,这个无限循环的坑我之前也踩过!问题出在你给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

