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

标签 java servlets jetty guice embedded-jetty

我正在使用带有 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/

相关文章:

java - istore 指令是否从 main 方法中的索引 1 开始?

java - Spring AOP 方面未执行

java - 子包的spring aop表达式

java - "to=3573072/3600000"在 java.io.EOFException : HttpConnectionOverHTTP? 异常中意味着什么

java - Jetty 不包括一些密码套件。为什么?

java - jetty 嵌入式: Using CORS + Basic authentication (ConstraintSecurityHandler)

java - 后缀数组实现错误

java - 引用从不同目录中的 jsp 打包的 servlet

java - 想在同一个 servlet 类中编写多个 doget 方法是否可能......如果是......如何......

Java Jersey 和 servlet 过滤器