gpt4 book ai didi

java - 使用 Jetty 支持 Angular 2 的 PathLocationHandler(使用 404 错误页面)

转载 作者:搜寻专家 更新时间:2023-11-01 03:18:20 24 4
gpt4 key购买 nike

我正在尝试研究如何使用嵌入式 Jetty 服务器支持 Angular 2 的 PathLocationHandler。为此,据我所知,我需要将任何 404 请求重定向到顶级 index.html 文件 ( https://stackoverflow.com/a/34104534/797 )

我认为这样做的方法是提供 ContextHandler 和 ErrorHandler,它们使用类似下面的代码将所有 404 请求重定向回/index.html(我实际上是在上下文 xml 文件中执行此操作,但代码可能更容易概念化/调试)。

我看到的是我的错误处理程序被完全忽略了,我不确定如何解决这个问题,或者我应该如何配置这些东西。


import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.handler.ContextHandler;
import org.eclipse.jetty.server.handler.ResourceHandler;
import org.eclipse.jetty.servlet.ErrorPageErrorHandler;

public class JettyTest {

public static void main(String[] args) throws Exception {
Server server = new Server(8080);

ResourceHandler resourceHandler = new ResourceHandler();
resourceHandler.setResourceBase("/tmp/directory-with-just-an-index.html-file");

ContextHandler contextHandler = new ContextHandler("/context-path");

ErrorPageErrorHandler errorHandler = new ErrorPageErrorHandler();
errorHandler.addErrorPage(404, "/index.html");

contextHandler.setHandler(resourceHandler);
contextHandler.setErrorHandler(errorHandler);

server.setHandler(contextHandler);

server.start();
System.out.println("Started!");
server.join();
}

}

为类似 http://localhost:8080/context-path/some-file-which-is-not-present.html 的请求单步执行 Jetty 代码,我看到的是 ResourceHandler 在它的 resourceBase 中找不到匹配的文件,然后调用...

    //no resource - try other handlers
super.handle(target, baseRequest, request, response);
return;

...然后我们从 ContextHandler 冒泡出来,最终 HttpChannelOverHttp 发出 404,因为请求未被视为已处理。

    if (!_response.isCommitted() && !_request.isHandled())
_response.sendError(404);

也许 Jetty 期望 ResourceHandler 以某种不同的方式发出 404 错误信号?或者更有可能的是,我没有考虑到我配置事物的方式。

错误配置提示可能是 https://www.eclipse.org/jetty/documentation/9.3.x/resource-handler.html ResourceHandler 提到“不存在的资源请求被允许通过(例如没有 404)”,但这让我不清楚下一步该去哪里,除了我宁愿避免的“编写你自己的处理程序”。

非常感谢任何指点!

最佳答案

一些让我头疼的事情让我想到了以下内容,它确实做了我想要的,尽管我仍然肯定会接受一个解释为什么 ResourceHandler 不适合我想要的东西的答案......

import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.servlet.DefaultServlet;
import org.eclipse.jetty.servlet.ErrorPageErrorHandler;
import org.eclipse.jetty.servlet.ServletContextHandler;
import org.eclipse.jetty.servlet.ServletHolder;

public class JettyTest {

public static void main(String[] args) throws Exception {
Server server = new Server(8080);

ServletContextHandler servletContextHandler = new ServletContextHandler();
servletContextHandler.setContextPath("/context-path");
servletContextHandler.setResourceBase("/tmp/directory-with-just-an-index.html-file");
servletContextHandler.addServlet(new ServletHolder(new DefaultServlet()), "/*");

ErrorPageErrorHandler errorHandler = new ErrorPageErrorHandler();
errorHandler.addErrorPage(404, "/index.html");

servletContextHandler.setErrorHandler(errorHandler);

server.setHandler(servletContextHandler);

server.start();
System.out.println("Started!");
server.join();
}

}

...现在尝试将其转换回 xml 上下文文件:)


...我最终做了以下内容,以防以后有人需要它。

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure.dtd">

<Configure class="org.eclipse.jetty.servlet.ServletContextHandler" id="myContext">

<Set name="contextPath">/context-path</Set>
<Set name="resourceBase">/tmp/directory-with-just-an-index.html-file</Set>

<!-- Direct all 404s to index.html (required by Angular's PathLocationStrategy) -->
<Set name="errorHandler">
<New class="org.eclipse.jetty.servlet.ErrorPageErrorHandler">
<Call name="addErrorPage">
<Arg type="int">404</Arg>
<Arg type="String">/index.html</Arg>
</Call>
</New>
</Set>

<Call name="addServlet">
<Arg><New class="org.eclipse.jetty.servlet.ServletHolder">
<Arg>
<New class="org.eclipse.jetty.servlet.DefaultServlet"></New>
</Arg>
</New></Arg>
<Arg>/*</Arg>
</Call>

</Configure>

关于java - 使用 Jetty 支持 Angular 2 的 PathLocationHandler(使用 404 错误页面),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39907830/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com