Сервлет для обслуживания статического контента - PullRequest
142 голосов
/ 25 сентября 2008

Я развертываю веб-приложение в двух разных контейнерах (Tomcat и Jetty), но их сервлеты по умолчанию для обслуживания статического содержимого имеют другой способ обработки структуры URL, которую я хочу использовать ( details ).

Поэтому я хочу включить в веб-приложение небольшой сервлет для обслуживания своего собственного статического содержимого (изображений, CSS и т. Д.). Сервлет должен иметь следующие свойства:

  • Нет внешних зависимостей
  • Простой и надежный
  • Поддержка заголовка If-Modified-Since (т.е. пользовательский getLastModified метод)
  • (Необязательно) поддержка кодировки gzip, etags, ...

Такой сервлет доступен где-нибудь? Самое близкое, что я могу найти, это пример 4-10 из книги сервлетов.

Обновление: Структура URL, которую я хочу использовать - если вам интересно - это просто:

    <servlet-mapping>
            <servlet-name>main</servlet-name>
            <url-pattern>/*</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
            <servlet-name>default</servlet-name>
            <url-pattern>/static/*</url-pattern>
    </servlet-mapping>

Таким образом, все запросы должны передаваться основному сервлету, если они не относятся к пути static. Проблема в том, что сервлет Tomcat по умолчанию не учитывает ServletPath (поэтому он ищет статические файлы в главной папке), а Jetty - (поэтому он смотрит в папку static).

Ответы [ 14 ]

1 голос
/ 08 января 2017

Проверено для Tomcat 8.x: статические ресурсы работают нормально, если корневой сервлет отображается в "". Для сервлета 3.x это можно сделать с помощью @WebServlet("")

1 голос
/ 27 сентября 2009

Для обслуживания всех запросов из приложения Spring, а также /favicon.ico и файлов JSP из / WEB-INF / jsp / *, которые будет запрашивать SpringU AbstractUrlBasedView, вы можете просто переназначить сервлет jsp и сервлет по умолчанию:

  <servlet>
    <servlet-name>springapp</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
  </servlet>

  <servlet-mapping>
    <servlet-name>jsp</servlet-name>
    <url-pattern>/WEB-INF/jsp/*</url-pattern>
  </servlet-mapping>

  <servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>/favicon.ico</url-pattern>
  </servlet-mapping>

  <servlet-mapping>
    <servlet-name>springapp</servlet-name>
    <url-pattern>/*</url-pattern>
  </servlet-mapping>

Мы не можем полагаться на шаблон URL * .jsp при стандартном отображении для сервлета jsp, поскольку шаблон пути / / * сопоставляется до того, как проверяется любое сопоставление расширения. Отображение сервлета jsp в более глубокую папку означает, что он сопоставляется первым. Совпадение /favicon.ico точно происходит до сопоставления с шаблоном пути. Подойдут более глубокие совпадения путей или точные совпадения, но никакие совпадения расширений не могут пройти после совпадения пути '/ *. Отображение «/» в сервлет по умолчанию не работает. Можно подумать, что точный символ '/' превзойдет шаблон пути '/ *' в springapp.

Приведенное выше решение для фильтрации не работает для переадресованных / включенных запросов JSP из приложения. Чтобы заставить его работать, мне пришлось применить фильтр непосредственно к Springapp, после чего сопоставление URL-паттерна было бесполезным, так как все запросы, поступающие в приложение, также попадают в его фильтры. Поэтому я добавил сопоставление с шаблоном в фильтр, а затем узнал о сервлете jsp и увидел, что он не удаляет префикс пути, как это делает сервлет по умолчанию. Это решило мою проблему, которая была не совсем такой же, но достаточно распространенной.

0 голосов
/ 27 июня 2009
0 голосов
/ 18 февраля 2009

Используйте org.mortbay.jetty.handler.ContextHandler. Вам не нужны дополнительные компоненты, такие как StaticServlet.

На пристани,

$ cd context

$ cp javadoc.xml static.xml

$ vi static.xml

...

<Configure class="org.mortbay.jetty.handler.ContextHandler">
<Set name="contextPath">/static</Set>
<Set name="resourceBase"><SystemProperty name="jetty.home" default="."/>/static/</Set>
<Set name="handler">
  <New class="org.mortbay.jetty.handler.ResourceHandler">
    <Set name="cacheControl">max-age=3600,public</Set>
  </New>
 </Set>
</Configure>

Установите значение contextPath с вашим префиксом URL и установите значение resourceBase в качестве пути к файлу статического содержимого.

Это сработало для меня.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...