2015-08-11 1 views
0

У меня есть приложение, использующее встроенный Jetty для обслуживания как интерфейса сайта, так и API.Обслуживание статических файлов с согласованием содержимого с помощью встроенного Jetty

Это написано на 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

Вы не используете статические файлы, если хотите использовать согласование контента.

Содержание Переговоры - это фундаментальная концепция HTTP, и это действительно для контента, который подается от (ресурса), который вы запрашиваете.

Обслуживание статических файлов - это специализированная форма «ресурс», где тип mime-type/content-type известен на основе расширения файла.

DefaultServlet (который выполняет статический файл, работающий в вашем примере) имеет еще одну функцию поверх этой специализации, но не для содержимого, а скорее для кодирования контента (вы можете предварительно сжать свои статические ресурсы создавая <filename>.gz файл, который находится рядом с исходным файлом, если запрашивающий клиент указывает на то, что они могут принять GZIP, то это <filename>.gz подается вместо несжатого <filename> версии.

для того, чтобы достичь этой цели, вы будете необходимо написать что-то, что служит для статических файлов таким образом, который имеет смысл для вас.

Что вы будете делать? d, если вы хотите сделать это сами.

  • Новый сервлет на URL-шаблон /*
  • Новый сервлета .init() создает структуру в памяти данных, где хранятся все известные статические файлы у вас есть, а также их расширения и MIME-типов.
  • Новый сервлет .doGet() будет обрабатывать любые входящие запросы, видя, есть ли приемлемый ресурс для обслуживания на основе этого поиска в памяти. Подавайте фактический контент, который вы хотите получить в этом режиме в памяти.
  • Не забывайте поддерживать ETag, запросы в диапазоне, серверный кэш, HTTP-кеш и Gzip.

 Смежные вопросы

  • Нет связанных вопросов^_^