如何解决嵌入式Tomcat设置Servlet为默认映射(/)的404问题?
嵌入式Tomcat将Servlet映射到根路径/返回404的解决方案
问题原因
当使用tomcat.addWebapp()创建上下文时,Tomcat会自动加载默认Web应用配置(包含DefaultServlet和欢迎页规则):
- 默认欢迎页列表(如
index.html、index.jsp)优先级高于Servlet的/映射,访问根路径时会优先查找匹配的静态文件 - DefaultServlet的
/映射会处理静态资源请求,可能抢占你的Servlet的根路径请求
解决方案
方案一:修改欢迎页列表,优先使用Servlet作为根路径处理器
在context方法中,将你的Servlet名称添加到欢迎页列表的最前端,让Tomcat访问/时优先调用该Servlet:
private Context context(Tomcat tomcat, ConfigurationProcess config, HttpServlet servlet) { String contextPath = ""; String servletName = servlet.getClass().getName(); String webapp = new File("src/main/webapp").getAbsolutePath(); Context context = tomcat.addWebapp(contextPath, webapp); context.setDocBase(webapp); context.setReloadable(true); // 注册Servlet并映射到/ tomcat.addServlet(contextPath, servletName, servlet); context.addServletMappingDecoded("/", servletName); // 修改欢迎页列表,将Servlet设为首选 WelcomeFileList welcomeFileList = new WelcomeFileList(); welcomeFileList.setWelcomeFiles(new String[]{servletName}); context.setWelcomeFileList(welcomeFileList); return context; }
此方案保留webapp目录的静态资源访问能力,同时让根路径优先走你的Servlet。
方案二:使用addContext替代addWebapp,避免默认配置干扰
如果不需要加载webapp目录的静态资源或默认web.xml配置,可创建纯程序式上下文,彻底规避默认规则的影响:
private Context context(Tomcat tomcat, ConfigurationProcess config, HttpServlet servlet) { String contextPath = ""; String servletName = servlet.getClass().getName(); // 用addContext创建无默认配置的上下文 Context context = tomcat.addContext(contextPath, new File("temp").getAbsolutePath()); // 注册Servlet并映射到/ tomcat.addServlet(contextPath, servletName, servlet); context.addServletMappingDecoded("/", servletName); // 如需静态资源支持,手动注册DefaultServlet(可选) // DefaultServlet defaultServlet = new DefaultServlet(); // tomcat.addServlet(contextPath, "default", defaultServlet); // context.addServletMappingDecoded("/*", "default"); return context; }
注意:此方式默认不处理静态资源,若需支持需手动注册DefaultServlet并映射到/*。
额外验证
确保你的Servlet继承的是Jakarta EE规范的jakarta.servlet.http.HttpServlet(Tomcat 10+已切换为Jakarta API,不再支持旧的javax.servlet.*包),依赖配置需对应Tomcat 10/11版本。
内容的提问来源于stack exchange,提问作者RAZANAKOLONA Erwan-Matthieu
相关产品推荐
相关产品推荐

