为了账号安全,请及时绑定邮箱和手机立即绑定

我如何更改它以用 html 页面替换 404 页面错误?

我如何更改它以用 html 页面替换 404 页面错误?

慕无忌1623718 2022-12-21 16:43:02
我必须使用我的 html 文件中的自定义页面更改 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[] { "./src/main/resources/index.html" });        ErrorPageErrorHandler errorHandler = new ErrorPageErrorHandler();        errorHandler.addErrorPage(HttpStatus.NOT_FOUND_404, "./src/main/resources/error.html");        context.setErrorHandler(errorHandler);        // HTML        DefaultServlet defaultServlet = new DefaultServlet();        ServletHolder holderPwd = new ServletHolder("default", defaultServlet);        holderPwd.setInitParameter("resourceBase", "./src/main/resources/index.html");        context.addServlet(holderPwd, "/*");        // SERVICES        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();        }    }
查看完整描述

1 回答

?
largeQ

TA贡献2039条经验 获得超7个赞

您还没有指出您收到的是哪种 404 错误。


如果 404 来自 Jetty 本身(不是上下文的一部分),则由Serverlevel控制ErrorHandler。(例如http://<machine>/foo/bar您场景中的 GET 请求,因为“/foo”不是您的“/wac”上下文的一部分)


如果 404 来自流回的错误ServletContextHandler,那么您现有ErrorPageErrorHandler的大部分是正确的。


第二个参数addErrorPage是 URL 路径(相对于您声明的基础资源),而不是文件系统路径。


示例(假设/error.html可通过网络 GET 请求访问):


ErrorPageErrorHandler errorHandler = new ErrorPageErrorHandler();

errorHandler.addErrorPage(HttpStatus.NOT_FOUND_404, "/error.html");

context.setErrorHandler(errorHandler);

注意:URL 路径可以指向一个 Servlet(你的,一个 jsp,一个 jersey 端点等),如果你愿意的话,它不一定是 HTML。


如果 404 来自 JAX-RS/Jersey 请求,则 JAX-RS/Jersey 中有特定处理以根据传入请求详细信息生成有效的 404 错误响应。


一个示例是请求 JSON 资源的 REST 客户端,而 Jersey 生成 404 响应,其中包含指示错误详细信息的 JSON 正文。


其他注意事项...


DefaultServlet defaultServlet = new DefaultServlet();

ServletHolder holderPwd = new ServletHolder("default", defaultServlet);

holderPwd.setInitParameter("resourceBase", "./src/main/resources/index.html");

不要在你的身上声明你的,resourceBase在你的DefaultServlet身上声明它ServletContextHandler。


ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS);

context.setContextPath("/rac");

context.setBaseResource(Resource.newResource("/path/to/my/base/directory"));

此外,aresourceBase是完全限定的目录路径(或 URI),绝不是文件或相对路径。


如果setWelcomeFiles传入的 GET 请求指向目录资源,则使用文件名或路径相对 URL 位置。


例子:


context.setWelcomeFiles(new String[] { "index.html", "welcome.html", "index.jsp" });

因此,对 say 的请求http://<machine>/wac/将导致实际服务http://<machine>/wac/index.html(如果存在)。


这也适用于深层目录请求,例如http://<machine>/wac/app/deps/scripts/jquery/会导致提供内容http://<machine>/wac/app/deps/scripts/jquery/index.html


查看完整回答
反对 回复 2022-12-21
  • 1 回答
  • 0 关注
  • 105 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信