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

如何将Jetty服务器的404错误页替换为自定义HTML页面?

解决Jetty自定义404错误页无法正常工作的问题

我瞅了下你的Jetty服务器代码,发现几个关键配置错误导致自定义404页面没生效,同时静态资源的处理逻辑也有问题。下面是修正后的完整代码,再给你拆解下哪里出了问题:

public static void main(String[] args) throws Exception {
    ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS);
    context.setContextPath("/rac");

    Server jettyServer = new Server(8080);

    // 配置欢迎文件:使用相对资源目录的文件名,而非完整路径
    context.setWelcomeFiles(new String[] { "index.html" });

    // 配置自定义错误页
    ErrorPageErrorHandler errorHandler = new ErrorPageErrorHandler();
    // 404错误跳转至相对资源目录的error.html,无需写开发时的src路径
    errorHandler.addErrorPage(HttpStatus.NOT_FOUND_404, "/error.html");
    context.setErrorHandler(errorHandler);

    // 配置DefaultServlet处理静态资源
    DefaultServlet defaultServlet = new DefaultServlet();
    ServletHolder holderPwd = new ServletHolder("default", defaultServlet);
    // resourceBase指向静态资源所在的目录,而不是单个index.html文件
    holderPwd.setInitParameter("resourceBase", "./src/main/resources/");
    // 让DefaultServlet处理所有静态资源请求
    context.addServlet(holderPwd, "/*");

    // 配置Jersey服务接口
    ServletHolder jerseyServlet = context.addServlet(org.glassfish.jersey.servlet.ServletContainer.class, "/ajax/*");
    jerseyServlet.setInitOrder(0);
    jerseyServlet.setInitParameter("jersey.config.server.provider.classnames", 
        DiskServiceWS.class.getCanonicalName() + "," + 
        RamServiceWS.class.getCanonicalName() + "," + 
        CpuServiceWS.class.getCanonicalName());

    jettyServer.setHandler(context);

    try {
        jettyServer.start();
        jettyServer.join();
    } finally {
        jettyServer.destroy();
    }
}

关键修改点说明

  • DefaultServlet的resourceBase配置错误:你之前把它设为了单个文件./src/main/resources/index.html,但这个参数需要指向静态资源的目录,Jetty会从这个目录里加载所有静态文件(包括错误页、首页等)。
  • 欢迎文件路径错误:setWelcomeFiles接收的是相对resourceBase的文件名,不需要写完整的src路径,直接写index.html即可。
  • 错误页路径配置错误:addErrorPage里的错误页路径同样要相对resourceBase,不能用开发时的./src/main/resources/error.html,直接写/error.html,Jetty会自动从resourceBase指定的目录中查找。
  • 额外注意事项:如果后续要把应用打包成可执行Jar,./src/main/resources/这个路径在运行时就不存在了,这时候需要把resourceBase改成类路径形式:holderPwd.setInitParameter("resourceBase", "classpath:/");,同时确保你的index.html和error.html被正确打包到Jar的类路径根目录下。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 07:46:44