【问题标题】:how can i change this to replace the 404 page error with a html page?我该如何更改它以用 html 页面替换 404 页面错误?
【发布时间】:2019-05-31 21:23:08
【问题描述】:

我必须使用我的 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();
        }
    }

【问题讨论】:

  • 哪个404错误?从码头?来自您的 ServletContextHandler?还是从你的 Jersey 层?

标签: java html servlets server jetty


【解决方案1】:

您还没有指出您遇到了哪种 404 错误。

如果 404 来自 Jetty 本身(不是上下文的一部分),那么它由 Server 级别 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 错误响应。

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

其他注意事项...

DefaultServlet defaultServlet = new DefaultServlet();
ServletHolder holderPwd = new ServletHolder("default", defaultServlet);
holderPwd.setInitParameter("resourceBase", "./src/main/resources/index.html");

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

ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS);
context.setContextPath("/rac");
context.setBaseResource(Resource.newResource("/path/to/my/base/directory"));

另外,resourceBase 是完全限定的目录路径(或 URI),而不是文件或相对路径。

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

例子:

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

所以说http://<machine>/wac/ 的请求将导致实际服务http://<machine>/wac/index.html(如果存在)。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-08
    • 2015-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-01
    • 1970-01-01
    相关资源
    最近更新 更多