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

如何解决嵌入式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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 23:13:17