我正在使用带有 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 embedded-jetty use with an application that has aServletContext
.
TheResourceHandler
is ultra-primitive (and very naive) and intended only to support web applications that use raw Jetty handlers only.
Do not mixResourceHandler
withContextHandler
,ServletContextHandler
, orWebAppContext
.
根据您的要求,我认为您想要这个......
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/