Отображение определенного сервлета в качестве сервлета по умолчанию в 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>