Сначала немного истории.
Еще во время основного выпуска Jetty 9.0.0 было 2 основных способа обработки статического содержимого: DefaultHandler
(и подчиненный ResourceHandler
).
Когда вышел основной выпуск Jetty 9.4.0 (это 4 основных выпуска Jetty позже, чем Jetty 9.0.0), была предпринята попытка заставить оба этих компонента использовать общую кодовую базу, поэтому ResourceService
был создан для стандартизацииобслуживание статического контента в одном месте.Теперь различия между DefaultHandler
и ResourceHandler
значительно сократились.( примечание: DefaultHandler
по-прежнему поддерживает больше собственных функций и больше возможностей различных спецификаций HTTP )
Далее, Проблема # 539 была разрешена для разрешенияResourceHandler
(и теперь DefaultHandler
), чтобы иметь настроенные списки каталогов.Для этого был введен интерфейс HttpOutput.ContentFactory
.
Новый HttpOutput.ContentFactory
отвечал за возвращение HttpContent
, представляющего предоставленный путь (и необязательный параметр конфигурации максимального размера буфера).
Это означает, что на данный момент мы имеем ...
- A
DefaultServlet
(или ResourceHandler
) - , который имеет
ResourceService
- Который получает его содержимое из
HttpOutput.ContentFactory
- Возвращенный
HttpContent
может быть статическим ресурсом, списком каталогов или файлом приветствия.
Когда приходит время отправкикусок статического контента, шаги предприняты ...
- Запросить
HttpContent
объект из HttpOutput.ContentFactory.getContent(path, maxBufferSize)
- Запросить представление
HttpContent
, которое можно использовать для отправкиссылочный контент, один из следующих (в этом порядке): - Если
HttpChannel
настроен на использование «прямых буферов», то запросите HttpContent.getDirectBuffer()
, представляющий весь контент.(это может быть файл с отображенной памятью, использующий незначительный объем памяти кучи) - Запросить
HttpContent.getIndirectBuffer()
, представляющий весь контент.(это может быть файл с отображенной памятью, использующий незначительный объем памяти кучи) - Запросить
HttpContent.getReadableByteChannel()
для отправки содержимого. - Запросить
HttpContent.getInputStream()
для отправки контента.
- Ошибка возврата, указывающая «Неизвестный контент»
Существует 2 основных реализации HttpOutput.ContentFactory
присутствует в Jetty 9.4.0 +
ResourceContentFactory
, который обрабатывает временное содержимое (не кэшируется) - если содержимое превышает maxBufferSize
, то исходные версии ByteBuffer
не будут возвращены. CachedContentFactory
, который будет кешировать различные ByteBuffer
значения, возвращенные из предыдущего HttpOutput
использования.
В CachedContentFactory
есть метод isCacheable(Resource)
, который запрашивается, чтобы узнать, является ли предоставленный ресурсследует вводить в кэш-память в памяти или нет.
Что касается параметра CompressedContentFormat[] precompressedFormats
в конструкторе CachedContentFactory
, который относится к форматам "предварительного сжатия", поддерживаемым как ResourceService
, так иCachedContentFactory
.
Типичная настройка по умолчанию: ...
CompressedContentFormat[] precompressedFormats = {
CompressedContentFormat.GZIP, // gzip compressed
CompressedContentFormat.BR, // brotli compressed
new CompressedContentFormat("bzip", ".bz") // bzip compressed
};
CachedContentFactory cachedContentFactory = new CachedContentFactory(parentContentFactory,
resourceFactory, mimeTypes, useFileMappedBuffers,
useEtags, precompressedFormats);
resourceService.setContentFactory(cachedContentFactory);
Эти precompressedFormats
относятся к статическому (и неизменяемому) содержимому, которое было предварительно сжато перед запуском сервера.
Это позволяет клиенту отправлять запрос, скажем ...
GET /css/main.css HTTP/1.1
Host: example.hostname.com
Accept-Encoding: gzip, deflate
and если каталог «Базовый ресурс» имеет ${resource.basedir}/css/main.css
И a ${resource.basedir}/css/main.css.gz
, то ответ будет отправлен из main.css.gz
(не main.css
), что приведет к ответу HTTP, подобному...
HTTP/1.1 200 OK
Date: Wed, 15 May 2019 20:17:22 GMT
Vary: Accept-Encoding
Last-Modified: Wed, 15 May 2019 20:17:22 GMT
Content-Type: text/css
ETag: W/"H/6qTDwA8vsH/6rJoEknqc"
Accept-Ranges: bytes
Content-Length: 11222