gpt4 book ai didi

java - 嵌入式 Jetty 处理 URL 来提供内容

转载 作者:行者123 更新时间:2023-12-02 04:24:25 30 4
gpt4 key购买 nike

我正在使用带有 Guice 的嵌入式 Jetty,并且想知道处理我的单页应用程序服务的最佳方法。

我希望 Jetty 能够像这样处理请求(按优先级顺序):

  • /socket必须由 websocket servlet 处理

  • /fs/read/* ,任何与此 url 匹配的内容都需要由自定义 servlet 处理

  • /* ,任何与此 url 匹配的内容都应该由/web在我的 Java 应用程序的类路径上(假设它不是)按上述处理。如果资源不存在,则提供服务 /web/index.html

现在我想知道处理这个问题的最佳方法?使用 REST 框架似乎很严厉,因为我实际上没有任何休息服务。

以下是我目前设置 Jetty 的方式:

ServletHolder servletHolder = new ServletHolder(DefaultServlet.class);

ServletContextHandler servletContextHandler = new ServletContextHandler(server, "/", ServletContextHandler.SESSIONS);
servletContextHandler.addFilter(GuiceFilter.class, "/*", EnumSet.allOf(DispatcherType.class));
servletContextHandler.addServlet(servletHolder, "/");

ResourceHandler resHandler = new ResourceHandler();
resHandler.setBaseResource(Resource.newClassPathResource("/web"));
server.setHandler(resHandler);

这是我的 Guice ServletModule :

serve("/socket/*").with(WebSocketManagerServlet.class);
serve("/fs/read/*").with(MyCustomServlet.class);

但是,我不确定如何执行最后一条规则,它将任何不匹配到 index.html 的内容重定向。并且仍然让 jetty 发送正确的 header ,其中正确的 mime 类型为 css/js/html Jetty 可能还做了一些内存映射和奇特的事情来快速服务这些我想维护的。

最佳答案

General Note: ResourceHandler is not for use with an application that has a ServletContext.
The ResourceHandler is ultra-primitive (and very naive) and intended only to support web applications that use raw Jetty handlers only.
Do not mix ResourceHandler with ContextHandler, ServletContextHandler, or WebAppContext.

根据您的要求,我认为您想要这个......

URL urlToWebDir = findUrlTo("/web");
ServletContextHandler servletContextHandler =
new ServletContextHandler(server, "/", ServletContextHandler.SESSIONS);
servletContextHandler.setContextPath("/");
servletContextHandler.setWelcomeFiles(new String[] { "index.html" });
servletContextHandler.setBaseResource(Resource.newResource(urlToWebDir));
servletContextHandler.addServlet(DefaultServlet.class, "/");

ErrorPageErrorHandler errorMapper = new ErrorPageErrorHandler();
errorMapper.addErrorPage(404,"/"); // map all 404's to root (aka /index.html)
servletContextHandler.setErrorHandler(errorMapper);

这是满足您的 "/web" 路径要求的更简单的设置。

BaseResource 是 URL(它可以是 jar:file://file:// URL 引用),它是由 DefaultServlet 用于提供静态内容。

因此,如果 /image.png 收到请求,则提供 {baseResource}/image.png (以及 /icons/上的请求) avatar.gif{baseResource}/icons/avatar.gif

提供

WelcomeFiles 设置 index.html 解析,以便对 / 的请求生成服务文件 {baseResource}/index.html。 (如果请求是 /alternate/path/deep/in/your/tree/ 然后 /alternate/path/deep/in/your/tree/index.html 也有效已提供(如果存在)。

额外说明:DefaultServlet 支持预压缩静态内容服务。这意味着,如果您对内容进行 gzip 压缩并保留其副本,那么如果用户的浏览器表示支持压缩响应,则将向用户提供压缩版本。 (例如:使用不支持压缩响应的旧浏览器请求 /js/hugelib.js ,然后提供 {baseResource}/js/hugelib.js 。但是如果浏览器支持压缩响应,则提供 {baseResource}/js/hugelib.js.gz )

关于java - 嵌入式 Jetty 处理 URL 来提供内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32378028/

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