Отображение определенного сервлета в качестве сервлета по умолчанию в Tomcat
Я пытаюсь реализовать сервлет, который получает необработанные запросы, и решает их обработать или перенаправить на другой сервер. Он похож на балансировщик нагрузки, где полученный запрос отправляется в один из пунктов назначения (в моем случае 2). Один из пунктов назначения - удаленный (на другом хосте). Кроме того, запросы могут поступать в корень (http://mycompany.com/).
Поскольку я хочу получать необработанные запросы, я реализовал свой собственный сервлет (подклассификация HttpServlet
), и это отлично работает. Мой сервлет выглядит так:
public class MyProxyServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
processOrForward(req, resp);
}
// also doGet(), doHead(), ...
}
Поскольку служба, которую я хочу обработать, может отправлять запросы корневому файлу, я хотел бы отобразить свой сервлет как сервлет по умолчанию, тем самым получив любой запрос, который не имеет явного отображения сервлета. Предположим, что мое имя сервлета является "myservlet" и работает вдоль другого сервлета "foo", я ожидаю, что все запросы в форме http://mycompany.com/foo/... для доставки в foo и все остальное (например,/,/bar/...,/myservlet/...) в "myservlet". Рассматривая более ранние сообщения (например, корневое сопоставление здесь и здесь или переписывание URL здесь), я думал, что понял, но это не сработает.
Вот мой web.xml:
<web-app>
<servlet>
<servlet-name>ProxyServlet</servlet-name>
<servlet-class>com.mycompany.MyProxyServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>ProxyServlet</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
</web-app>
В приведенном выше web.xml для url-шаблона я попробовал
"/" and "/*" and empty (i.e., <url-pattern></url-pattern>), all behave the same -->
Requests to root (/)goes to tomcat default servlet
Requests to /myservlet/... are handled by "myservlet"
Requests to /fubar/... are always 404
Есть ли способ повернуть мой сервлет по умолчанию. I.e, любой запрос, который не привязывается к сервлету, не подходит для моего (это даже приемлемо для получения всех запросов, поскольку я могу развернуть этот сервлет в своем собственном контейнере). В случае, если это имеет значение, я использую Tomcat 7.0.30 на Ubuntu 12.10.
Ответы
Ответ 1
Это должно быть полезно для вас.
Из Спецификация сервлетов Java ™ версии 3.1 (JSR 340)
Глава 12. Запросы сопоставления сервлетам
12.2 Спецификация сопоставлений
В дескрипторе развертывания веб-приложения для определения сопоставлений используется следующий синтаксис:
-
Строка, начинающаяся с символа /
и заканчивающейся суффиксом /*
, используется для отображение пути.
-
Строка, начинающаяся с префикса *.
, используется как расширение расширения.
-
Пустая строка ("")
- это специальный шаблон URL , который точно соответствует корневой контекст приложения, то есть запросы формы http://host:port/<contextroot>/
. В этом случае информация о пути - /
, а путь сервлетов и путь контекста - пустая строка ("")
.
-
Строка, содержащая только символ /
, указывает "по умолчанию" сервлетвыражение. В этом случае путь сервлета является URI запроса минус путь контекста и информация о пути равна NULL.
- Все остальные строки используются только для точных совпадений.
В качестве дополнения прочитайте это замечательное объяснение с помощью коротких примеров из книги Head First Servlets и JSP: передача экзамена на сертификацию веб-компонентов Sun Certified (2-е издание) (цитата):
ТРИ типа элементов <url-pattern>
1) ТОЧНОЕ соответствие
Пример:
<url-pattern>/Beer/SelectBeer.do</url-pattern>
- ДОЛЖЕН начинаться с косой черты (
/
). - Может иметь расширение (например .do), но его не требуется.
2) Соответствие DIRECTORY
Пример:
<url-pattern>/Beer/*</url-pattern>
- ДОЛЖЕН начинаться с косой черты (
/
). - Всегда заканчивается косой чертой/звездочкой (
/*
).
3) Сопоставление EXTENSION
Пример:
<url-pattern>*.do</url-pattern>
- ДОЛЖЕН начинаться со звездочки (
*
) (НИКОГДА с косой чертой). - После звездочки он ДОЛЖЕН иметь расширение точки (.do,.jsp и т.д.).
ВАЖНОЕ ПРИМЕЧАНИЕ:
Шаблоны URL представляют собой логическую/виртуальную структуру, то есть указанные шаблоны (пути) физически не должны существовать.
UPDATE
Если вы хотите, как вы говорите в своем комментарии,
Мне нужен хост: порт для моего сервлета, а не сервлет по умолчанию tomcat
то см. решение здесь:
Как сделать мое веб-приложение стандартным приложением Tomcat
Другими словами, вам нужен путь без контекста приложения, что подразумевает контекст приложения приложения по умолчанию Tomcat.
Цитата из указанной ссылки:
В стандартной установке Tomcat вы заметите, что при том же (CATALINA_BASE)/webapps/, существует каталог с именем ROOT(капиталы важны даже под Windows). Это место жительства текущего приложения Tomcat по умолчанию, которое прямо сейчас, когда пользователь вызывает http://myhost.company.com[:port]
. Хитрость заключается в том, чтобы приложения на его месте.
Ответ 2
Я не уверен, понял ли я, что вы хотите, но, вероятно, перехват 404 - это то, что вы хотите сделать, а затем перенаправление туда, где вы хотите.
Я пришел сюда на форум, потому что у меня странная проблема с tomcat 7, моя делает именно то, что вы хотите;)
Это единственный способ, которым я могу иметь root, EMPTY
<servlet-mapping>
<servlet-name>Default</servlet-name>
<url-pattern></url-pattern>
</servlet-mapping>
Таким образом: все перенаправляется на этот сервлет, включая изображения и т.д., например, я открываю другую страницу, это показывает это, root, затем я могу видеть в log 4 больше запросов на одну страницу, 3 для css и один для изображения.
<servlet-mapping>
<servlet-name>Default</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>