Настроить web.xml (Tomcat 5) для одного сервлета для обработки всех входящих запросов? - PullRequest
5 голосов
/ 29 апреля 2009

В основном я хочу, чтобы один сервлет обрабатывал все входящие запросы независимо от пути. Я нахожусь в среде общего хостинга с доступом к настройке моего собственного файла web.xml.

В web.xml настроено следующее, но в Tomcat 5 это не работает:

<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="2.4" 
    xmlns="http://java.sun.com/xml/ns/j2ee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation=
        "http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">  
    <display-name>Redirect</display-name>
    <servlet>
         <display-name>Redirect</display-name>
         <servlet-name>Redirect</servlet-name>
         <servlet-class>com.Redirect</servlet-class>
         <init-param>
            <param-name>host</param-name>
            <param-value>www.myredirectdomain.com</param-value>
        </init-param>
        <init-param>
            <param-name>redirect-type</param-name>
            <param-value>301</param-value>
        </init-param>
    </servlet>
    <servlet-mapping>
        <servlet-name>Redirect</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
</web-app>

Вышеприведенное работает для всего, что начинается с каталога в пути, например:

www.mydomain.com/anypath1/anypath2...
www.mydomain.com/anypath1

Однако не работает для:

www.mydomain.com/ or
www.mydomain.com

Я также попробовал следующее отображение сервлета:

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

С тем же результатом. Ни сработало ... У кого-нибудь есть предложения?

Ответы [ 4 ]

4 голосов
/ 13 мая 2009

Tomcat 5 реализует спецификацию сервлета 2.4. Его можно скачать здесь: JCP Servlet 2.4 Spec

На стр. 86 - SRV.11.2 описывает, как задать отображения сервлетов. Если я понимаю, что вы пытаетесь сделать правильно, вы пытаетесь перехватить каждый запрос (независимо от того, какой путь) к вашему серверу с помощью одного сервлета. Чтобы это работало, ваше веб-приложение должно быть смонтировано в контексте по умолчанию («ROOT») в случае Tomcat, а ваш сервлет должен быть сопоставлен с сервлетом по умолчанию в вашем файле web.xml. Ваше отображение в вашем файле web.xml правильное.

<servlet-mapping>
    <servlet-name>Redirect</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

Я думаю, что у вас проблема с контекстом ROOT. Что показывает доступ к www.mydomain.com/ и www.mydomain.com? Вы не упоминаете, дает ли ваша среда общего хостинга полный доступ к вашей собственной конфигурации Tomcat, но если вы можете получить доступ и изменить каталог $ TOMCAT5_HOME / conf, есть несколько способов сделать эту работу для вас.

Вероятно, самый чистый способ - добавить следующее:

< Context path="" debug="0" docBase="your-app">

в $ TOMCAT5_HOME / conf / server.xml. Это предполагает, что ваши приложения называются «your-app.war».

Надеюсь, это поможет.

1 голос
/ 08 мая 2009

<url-pattern>/*</url-pattern> должно работать. Ваше веб-приложение должно быть развернуто в корневом контексте. По умолчанию tomcat использует веб-приложение с именем ROOT; однако вы можете изменить его для поиска другого веб-приложения в вашем server.xml.

Другой подход заключается в создании ServletFilter для выполнения работы и сопоставления его таким же образом. У каждого подхода есть свои плюсы и минусы (сервлет и фильтр сервлетов). Однако из вашего примера похоже, что вы просто хотите отправить все на другой сайт, поэтому любой из них должен работать.

0 голосов
/ 29 апреля 2009

Pattern / * обязательно вызовет ваш сервлет Redirect. Вы отлаживали свой сервлет, чтобы узнать, получил ли он запрос на этот URL? Что значит быть не работал? Вы получили ошибку или что случилось?

0 голосов
/ 29 апреля 2009

Вы пробовали

<url-pattern>*</url-pattern>

...