映射的servlet/*
也将在RequestDispatcher#forward()
调用上运行。因此,如果您在该servlet中执行转发,则每次都会在无限循环中调用自身。那解释了StackOverflowError
。
毕竟,您根本不应该使用/*
servlet。它仅在servlet过滤器上有意义。将Servlet映射放回更特定的URL模式,并创建一个过滤器,/*
必要时将其转发到所需的servlet。您当然不希望Servlet处理例如images / CSS / JS文件。假设它们都放在/resources
文件夹中,并且前端控制器已映射到/myservlet/*
,则在中执行以下操作doFilter()
:
HttpServletRequest req = (HttpServletRequest) request;
String path = req.getRequestURI().substring(req.getContextPath().length());
if (path.startsWith("/resources/")) {
// Just let container's default servlet do its job.
chain.doFilter(request, response);
}
else {
// Delegate to your front controller.
request.getRequestDispatcher("/myservlet" + path).forward(request, response);
}