Почему Jetty обслуживает css с типом содержимого text / html

Я использую встроенный сервер Jetty в приложении Scalatra. Проблема в том, что он обслуживает 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 обслуживается с правильным типом содержимого. Однако приложение не работает :(


person Emil Ivanov    schedule 06.04.2013    source источник
comment
какие версии scala и scalatra вы используете?   -  person Alex Yarmula    schedule 06.04.2013
comment
Скала 2.10, Скалатра 2.2   -  person Emil Ivanov    schedule 06.04.2013
comment
Я сделал простое приложение с вашим кодом, теми же версиями и фиктивным контроллером. Я все еще могу видеть возвращаемый правильный тип контента, а также перенаправлять запросы на главный контроллер. Возможно, проблема в другом.   -  person Alex Yarmula    schedule 06.04.2013


Ответы (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.

person Joakim Erdfelt    schedule 06.04.2013
comment
mime.properties есть и имеет правильную строку css. Я использую sbt для управления депс, кстати. Использование ResourceHandler исправляет тип содержимого, но я не могу найти способ объединить его с WebAppContext. Кроме того, я вообще не использую web.xml файл. - person Emil Ivanov; 06.04.2013
comment
Неважно, есть у вас web.xml или нет. webdefault.xml по-прежнему требуется. Возьмите его копию, измените ее в соответствии со своими потребностями (например, удалите поддержку jsp), получите ссылку на файл и установите ссылку на этот файл с помощью WebAppContext.setDefaultsDescriptor(String). Предполагается, что DefaultServlet обслуживает ваш файл CSS. Это может быть сама Scala, обслуживающая CSS, если да, вам необходимо настроить Scala. - person Joakim Erdfelt; 06.04.2013
comment
ты прав. Проблема заключалась в том, что Scala обслуживала css. Когда я добавил web.xml с правильными настройками, чтобы default-servlet их обслуживал, все заработало. - person Emil Ivanov; 07.04.2013