使用嵌入式Jetty

时间:2015-08-11 11:00:47

标签: rest http jetty embedded-jetty content-negotiation

我有一个使用嵌入式Jetty的应用程序既可以提供站点的前端,也可以提供API。

它是用Scala编写的,但这并不是真正相关的。我设置所有内容的文件如下所示:

val servlet = new ServletHolder(Servlet)

val frontend = new ServletHolder(new DefaultServlet())
frontend.setInitParameter("resourceBase", "frontend")

val handler = new ServletContextHandler()
handler.addServlet(servlet, "/api/*")
handler.addServlet(frontend, "/*")

val server = new Server(8080)
server.setHandler(handler)
server.start()

但是,/提供的静态内容要求我为静态内容使用文件扩展名 - 我想使用content negotiation以便不需要这些内容。这可能吗?

1 个答案:

答案 0 :(得分:1)

如果要使用内容协商,则不提供静态文件。

内容协商是HTTP的一个基本概念,它实际上适用于您正在请求的(挥手)"资源"提供的内容。

提供静态文件是" resource"的一种特殊形式,其中mime-type / content-type是基于其文件扩展名而知道的。

DefaultServlet(在您的示例中执行静态文件服务)在此专业化之上还有1个功能,但不是内容类型,而是内容编码(您可以通过以下方式预压缩静态资源)创建位于原始文件旁边的<filename>.gz文件,如果请求客户端表明他们可以接受gzip,则会提供此<filename>.gz而不是未压缩的<filename>版本。

为了实现这一目标,您需要以对您有意义的方式编写提供静态文件的内容。

如果你想自己做这件事,你需要什么。

  • url-pattern /*
  • 上的新servlet
  • 新的servlet .init()创建了一个内存数据结构,其中包含您拥有的所有已知静态文件,以及它们的扩展名和mime-types。
  • 新的servlet .doGet()将通过查看是否存在可接受的资源来处理任何传入请求,这些资源基于此内存中查找进行处理。通过此内存中查找提供您想要的实际内容。
  • 别忘了支持ETag,Ranged请求,服务器响应缓存,HTTP缓存和Gzip。