如何将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
相关产品推荐
相关产品推荐

