为啥 Jetty 使用 text/html 内容类型提供 css

Posted

技术标签:

【中文标题】为啥 Jetty 使用 text/html 内容类型提供 css【英文标题】:Why is Jetty serving css with text/html content type为什么 Jetty 使用 text/html 内容类型提供 css 【发布时间】:2013-03-28 23:04:27 【问题描述】:

我在 Scalatra 应用程序中使用嵌入式 Jetty 服务器。问题是它为 css 文件提供 text/html 内容类型:

这里是主要方法:

package yard.web

import org.eclipse.jetty.server.Server
import org.eclipse.jetty.webapp.WebAppContext
import org.scalatra.servlet.ScalatraListener

object JettyMain 
  def main(args: Array[String]) 
    val server = new Server(9080)
    val context: WebAppContext = new WebAppContext("src/main/webapp", "/")
    context.setServer(server)
    context.setInitParameter(ScalatraListener.LifeCycleKey, "yard.web.ScalatraBootstrap")
    context.addEventListener(new ScalatraListener())
    server.setHandler(context)

    server.start()

    println("Press ENTER to stop server")
    Console.readLine()
    server.stop()
    server.join()
  

该文件位于src/main/webapp/libs/bootstrap/css/bootstrap.css,并提供给:

$ curl --head http://localhost:9080/libs/bootstrap/css/bootstrap.css
HTTP/1.1 200 OK
Content-Type: text/html;charset=UTF-8
Last-Modified: Sat, 06 Apr 2013 14:30:35 GMT
Content-Length: 127247
Accept-Ranges: bytes
Server: Jetty(8.1.10.v20130312)

为什么 Jetty 认为它是一个 html 文件?


为了完整性,这里是 ScalatraBootstrap 类:

package yard.web

import org.scalatra.LifeCycle
import javax.servlet.ServletContext
import yard.Settings
import yard.db.Store

class ScalatraBootstrap extends LifeCycle 
  override def init(context: ServletContext) 

    val settings = Settings.default
    val db = Store(settings).db

    context mount (new MainServlet, "/")
  


更新:使用 ResourceHandler 会导致 CSS 以正确的内容类型提供服务。但是,该应用程序不起作用:(

【问题讨论】:

你用的是什么版本的scala和scalatra? scala 2.10,scalatra 2.2 我用你的代码、相同的版本和一个虚拟控制器制作了一个简单的应用程序。我仍然可以看到返回的正确内容类型,以及将请求路由到主控制器。问题可能出在其他地方。 【参考方案1】:

CSS 文件通常由 org.eclipse.jetty.servlet.DefaultServlet 提供。

在分发版的etc/webdefault.xml 文件中声明。

由于您使用的是嵌入式模式,因此您需要通过调用 WebAppContext.setDefaultsDescriptor(String) 手动提供此文件,并附上您的 etc/webdefault.xml 文件的路径。

最后,mime 类型本身由DefaultServlet 通过mime.properties 文件加载,该文件由Jetty 通过调用Classloader.getResource("/org/eclipse/jetty/http/mime.properties") 加载。

注意:mime.properties 文件位于 jetty-http-8.1.10.v20130312.jar 文件中。

【讨论】:

mime.properties 在那里并且有正确的 css 行。顺便说一句,我正在使用 sbt 来管理部门。使用ResourceHandler 修复了内容类型,但我找不到将它与WebAppContext 结合的方法。另外,我实际上并没有使用任何web.xml 文件。 有没有web.xml 并不重要。 webdefault.xml 仍然是必需的。获取它的副本,修改它以满足您的需要(例如删除 jsp 支持),获取对它的文件引用,并通过 WebAppContext.setDefaultsDescriptor(String) 设置该文件引用。这是假设 DefaultServlet 正在为您的 CSS 文件提供服务。可能是 Scala 本身为 CSS 服务,如果是这样,您需要配置 Scala。 你是对的。问题是 Scala 正在为 css 服务。当我添加具有正确设置的web.xml 以让default-servlet 为他们服务时,一切正常。

以上是关于为啥 Jetty 使用 text/html 内容类型提供 css的主要内容,如果未能解决你的问题,请参考以下文章

为啥编码标头内容类型:text/html;在 Outlook 插件中使用 MailItem 时缺少 GMAIL 的 SMTP 服务器:SMTP.GMAIL.COM?

为啥有人会使用 jetty-maven-plugin 与嵌入式码头

Tapestry 5.3.8 + Jetty + Hibernate 4.3.5 + XAMPP 1.8.3 - IdClass 使用(派生)实体,为啥在尝试合并时它们会分离?

为啥spring webflux默认选择jetty然后失败?

jetty 支持内嵌ssh项目吗,为啥在tomcat下面正常的war 放到jetty就跑不起来

为啥我们需要 HTML 头部中的元内容类型标签?