Как я могу изменить это, чтобы заменить ошибку 404 страницы HTML-страницы? - PullRequest
0 голосов
/ 30 мая 2019

Мне нужно изменить страницу с ошибкой 404 на обычную страницу из моего html-файла. Я написал этот код, но он не работает, и / или я не знаю, как его использовать.

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 Ответ

0 голосов
/ 31 мая 2019

Вы не указали, какую ошибку 404 вы получаете.

Если 404 от самой Jetty (не является частью контекста), то это контролируется Server level ErrorHandler.(например, запрос GET для http://<machine>/foo/bar в вашем сценарии, поскольку "/ 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-адреса может указывать на сервлет (ваш, jsp, конечную точку jersey и т. д.), если вы хотите, это не обязательно должен быть HTML.

Если 404 от запроса JAX-RS / Джерси, то в JAX-RS / Джерси есть специальная обработка для получения действительного ответа об ошибке 404 на основе входящегодетали запроса.

Примером может служить клиент REST, запрашивающий ресурс JSON, и Джерси, выдающий ответ 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"));

Кроме того, resourceBase - это полный путь к каталогу (или URI), а не файл или относительный путь.

И setWelcomeFiles - это имена файлов или относительные пути к URL-адресам, которые следует использовать, если входящий запрос GET относится к ресурсу каталога.

Пример:

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

...