Я разворачиваю веб-приложение в двух разных контейнерах (Tomcat и Jetty), но их сервлеты по умолчанию для обслуживания статического содержимого имеют другой способ обработки структуры URL, которую я хочу использовать ( подробности ).
Поэтому я хочу включить в веб-приложение небольшой сервлет для обслуживания своего собственного статического содержимого (изображения, 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
папке).
источник
Ответы:
Я придумал немного другое решение. Это немного взломать, но вот отображение:
Это в основном просто сопоставляет все файлы содержимого по расширению с сервлетом по умолчанию, а все остальное с «myAppServlet».
Работает как в Jetty, так и в Tomcat.
источник
*.sth
. Если кто-то получит URL,example.com/index.jsp?g=.sth
он получит источник файла JSP. Или я не прав? (Я новичок в Java EE) Я обычно использую шаблон URL/css/*
и т. Д.В этом случае не требуется полностью настраиваемая реализация сервлета по умолчанию, вы можете использовать этот простой сервлет для переноса запроса в реализацию контейнера:
источник
У меня были хорошие результаты с FileServlet , так как он поддерживает почти все HTTP (etags, chunking и т. Д.).
источник
Абстрактный шаблон для сервлета статического ресурса
Частично основанный на этом блоге с 2007 года, вот модернизированный и многократно используемый абстрактный шаблон для сервлета, который правильно работает с кэшированием
ETag
,If-None-Match
иIf-Modified-Since
(но без поддержки Gzip и Range; просто, чтобы сделать это простым; Gzip можно было бы сделать с помощью фильтра или через конфигурация контейнера).Используйте его вместе с интерфейсом ниже, представляющим статический ресурс.
Все, что вам нужно, это просто выйти из данного абстрактного сервлета и реализовать
getStaticResource()
метод в соответствии с javadoc.Конкретный пример обслуживания из файловой системы:
Вот конкретный пример, который обслуживает его через URL-адрес, например,
/files/foo.ext
из файловой системы локального диска:Конкретный пример подачи из базы данных:
Вот конкретный пример, который обслуживает его через URL-адрес, например,
/files/foo.ext
из базы данных через вызов службы EJB, который возвращает ваше лицо, имеющееbyte[] content
свойство:источник
files/%2e%2e/mysecretfile.txt
. Этот запрос выдаетfiles/../mysecretfile.txt
. Я проверил это на Tomcat 7.0.55. Они называют это лазанием по каталогуЯ в конечном итоге прокатки мой собственный
StaticServlet
. Он поддерживаетIf-Modified-Since
кодировку gzip и должен иметь возможность обслуживать статические файлы из war-файлов. Это не очень сложный код, но и не совсем тривиальный.Код доступен: StaticServlet.java . Не стесняйтесь комментировать.
Обновление: Khurram спрашивает о
ServletUtils
классе, на который есть ссылкаStaticServlet
. Это просто класс со вспомогательными методами, которые я использовал для своего проекта. Единственный метод, который вам нуженcoalesce
(это идентично функции SQLCOALESCE
). Это код:источник
Судя по приведенному выше примеру информации, я думаю, что вся эта статья основана на ошибочном поведении в Tomcat 6.0.29 и более ранних версиях. См. Https://issues.apache.org/bugzilla/show_bug.cgi?id=50026 . Обновление до Tomcat 6.0.30 и поведение между (Tomcat | Jetty) должно слиться.
источник
svn diff -c1056763 http://svn.apache.org/repos/asf/tomcat/tc6.0.x/trunk/
. Наконец, после маркировки этого WONTFIX +3 года назад!попробуй это
Изменить: Это действительно только для спецификации сервлета 2.5 и выше.
источник
У меня была та же проблема, и я решил ее, используя код «сервлета по умолчанию» из базы кода Tomcat.
https://github.com/apache/tomcat/blob/master/java/org/apache/catalina/servlets/DefaultServlet.java
DefaultServlet это сервлет , который обслуживает статические ресурсы (JPG, HTML, CSS, GIF и т.д.) в Tomcat.
Этот сервлет очень эффективен и имеет некоторые свойства, которые вы определили выше.
Я думаю, что этот исходный код - хороший способ запустить и удалить функциональность или зависимости, которые вам не нужны.
источник
org.apache.*
. Как вы можете использовать его с Jetty?Я нашел отличный учебник в Интернете о некоторых обходных путях. Он прост и эффективен, я использовал его в нескольких проектах с использованием стилей REST urls:
http://www.kuligowski.pl/java/rest-style-urls-and-url-mapping-for-static-content-apache-tomcat,5
источник
Я сделал это, расширив tomcat DefaultServlet ( src ) и переопределив метод getRelativePath ().
... и вот мои отображения сервлетов
источник
Чтобы обслуживать все запросы из приложения Spring, а также /favicon.ico и файлов JSP из / WEB-INF / jsp / *, которые будет запрашивать SpringU AbstractUrlBasedView, вы можете просто переназначить сервлет jsp и сервлет по умолчанию:
Мы не можем полагаться на шаблон URL * .jsp в стандартном отображении для сервлета jsp, потому что шаблон пути '/ *' сопоставляется до того, как проверяется любое сопоставление расширения. Отображение сервлета jsp в более глубокую папку означает, что он сопоставляется первым. Соответствие «/favicon.ico» точно происходит до сопоставления с шаблоном пути. Подойдут более глубокие совпадения путей или точные совпадения, но никакие совпадения расширений не смогут пройти после совпадения пути '/ *. Отображение «/» на сервлет по умолчанию не работает. Вы могли бы подумать, что точный символ '/' превзойдет шаблон пути '/ *' в Springapp.
Приведенное выше решение для фильтрации не работает для переадресованных / включенных запросов JSP из приложения. Чтобы заставить его работать, мне пришлось применить фильтр непосредственно к Springapp, после чего сопоставление URL-паттерна было бесполезным, так как все запросы, поступающие в приложение, также попадают в его фильтры. Поэтому я добавил сопоставление с шаблоном в фильтр, а затем узнал о сервлете 'jsp' и увидел, что он не удаляет префикс пути, как это делает сервлет по умолчанию. Это решило мою проблему, которая была не совсем такой же, но достаточно распространенной.
источник
Проверено на Tomcat 8.x: статические ресурсы работают нормально, если корневой сервлет отображается в "". Для сервлета 3.x это может быть сделано
@WebServlet("")
источник
Используйте org.mortbay.jetty.handler.ContextHandler. Вам не нужны дополнительные компоненты, такие как StaticServlet.
На пристани,
$ cd contexts
$ cp javadoc.xml static.xml
$ vi static.xml
...
Установите значение contextPath с вашим префиксом URL и установите значение resourceBase в качестве пути к файлу статического содержимого.
Это сработало для меня.
источник
См. StaticFile в JSOS: http://www.servletsuite.com/servlets/staticfile.htm
источник