【问题标题】:Serving static files with content negotiation using embedded Jetty使用嵌入式 Jetty 提供具有内容协商的静态文件
【发布时间】:2015-08-11 11:00:46
【问题描述】:

我有一个应用程序使用嵌入式 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,这样就不需要这些。这可能吗?

【问题讨论】:

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


    【解决方案1】:

    如果您想使用内容协商,您不是在提供静态文件。

    内容协商是 HTTP 的一个基本概念,它真正适用于您请求的(挥手)“资源”提供的内容。

    提供静态文件是“资源”的一种特殊形式,其中 mime-type / content-type 是根据其文件扩展名来确定的。

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2012-05-04
      • 1970-01-01
      • 2014-03-08
      • 1970-01-01
      • 1970-01-01
      • 2013-12-11
      • 2010-09-09
      • 2011-09-15
      • 2018-02-12
      相关资源
      最近更新 更多