Mapeando um Servlet Específico para Ser o Servlet Padrão no Tomcat

Estou tentando implementar um servlet que recebe solicitações brutas e decido processá-las ou encaminhá-las para outro servidor de back-end. É semelhante a um balanceador de carga, em que uma solicitação recebida é encaminhada para um dos destinos (no meu caso 2). Um dos destinos é remoto (em outro host). Além disso, as solicitações podem chegar à raiz ( http://mycompany.com/ ).

Como desejo obter solicitações brutas, implementei meu próprio servlet (subclassificando HttpServlet ) e isso funciona muito bem. Meu servlet parece:

 public class MyProxyServlet extends HttpServlet { @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { processOrForward(req, resp); } // also doGet(), doHead(), ... } 

Como o serviço que desejo processar pode enviar solicitações para a raiz, gostaria de mapear meu servlet para ser o servlet padrão, recebendo assim qualquer solicitação que não tenha um mapeamento de servlet explícito. Supondo que o nome do meu servlet seja “myservlet” e esteja sendo executado ao lado de outro servlet “foo”, espero que todos os pedidos na forma de http://mycompany.com/foo/ … sejam entregues para foo, e tudo else (por exemplo, /, / bar / …, / myservlet / …) para “myservlet”. Olhando para posts anteriores (por exemplo, mapeamento de raízes aqui e aqui , ou reescrevendo url aqui ), eu pensei que eu descobri, mas não funciona.

Aqui está o meu web.xml :

   ProxyServlet com.mycompany.MyProxyServlet 1   ProxyServlet /*   

No web.xml acima, para padrão de URL, tentei

 "/" and "/*" and empty (ie, ), all behave the same --> Requests to root (/)goes to tomcat's default servlet Requests to /myservlet/... are handled by "myservlet" Requests to /fubar/... are always 404 

Existe uma maneira de transformar meu servlet em padrão. Ou seja, qualquer pedido que não mapeie especificamente para um servlet chega ao meu (é até aceitável receber todos os pedidos, já que posso implementar esse servlet em seu próprio contêiner). Caso seja importante, estou usando o Tomcat 7.0.30 no Ubuntu 12.10.

Isso deve ser útil para você.

Do Java ™ Servlet Specification versão 3.1 (JSR 340)

Capítulo 12. Mapeando Solicitações para Servlets

12.2 Especificação de mapeamentos

No descritor de implementação do aplicativo da Web, a seguinte syntax é usada para definir mapeamentos:

  • Uma cadeia que começa com um caractere / e termina com um sufixo /* é usada para o mapeamento de caminho .

  • Uma cadeia que começa com um *. O prefixo é usado como um mapeamento de extensão .

  • A string vazia ("") é um padrão de URL especial que mapeia exatamente para a raiz de contexto da aplicação , isto é, solicitações da forma http://host:port// . Nesse caso, a informação do caminho é / e o caminho do servlet e o caminho do contexto são string vazia ("") .

  • Uma cadeia contendo apenas o caractere / indica o servlet “padrão” do aplicativo. Nesse caso, o caminho do servlet é o URI do pedido menos o caminho do contexto e a informação do caminho é nula.

  • Todas as outras strings são usadas apenas para correspondências exatas .

Como complemento, leia esta boa explicação com breves exemplos do livro Head First Servlets & JSP: Passando no Exame de Desenvolvedor da Sun Certified Web Component (2ª edição) (citação):

Os TRÊS tipos de elementos

1) jogo EXATO

Exemplo:
/Beer/SelectBeer.do

  • DEVE começar com uma barra ( / ).
  • Pode ter uma extensão (como .do), mas não é necessária.

2) Correspondência de DIRETÓRIO

Exemplo:
/Beer/*

  • DEVE começar com uma barra ( / ).
  • Sempre termina com uma barra / asterisco ( /* ).

3) jogo EXTENSION

Exemplo:
*.do

  • DEVE começar com um asterisco ( * ) (NUNCA com uma barra).
  • Depois do asterisco, DEVE ter uma extensão de ponto (.do, .jsp, etc.).

NOTA IMPORTANTE:
Os padrões de URL representam a estrutura lógica / virtual , ou seja, os padrões (caminhos) especificados não precisam existir fisicamente .


ATUALIZAR

Se você quiser, como você diz no seu comentário,

Eu quero host: porta para bater meu servlet, não o servlet tomcat padrão

então veja a solução aqui:
Como faço para que meu aplicativo da web seja o aplicativo padrão do Tomcat

Em outras palavras, o que você deseja é um caminho sem contexto de aplicativo , o que implica o contexto de aplicativo do aplicativo padrão do Tomcat.

Cite o link acima:

Em uma instalação padrão do Tomcat, você notará que sob o mesmo diretório (CATALINA_BASE) / webapps /, existe um diretório chamado ROOT (as maiúsculas são importantes, mesmo no Windows). Essa é a residência do aplicativo padrão atual do Tomcat, aquele que é chamado agora quando um usuário chama http://myhost.company.com[:port] . O truque é colocar seu aplicativo em seu lugar.

Eu não tenho certeza se entendi o que você quer, mas provavelmente interceptar 404 é o que você quer fazer, então redirect onde quiser.

Eu vim aqui para o fórum porque eu tenho um problema estranho com o tomcat 7, o meu está fazendo exatamente o que você quer;)

Esta é apenas uma maneira de ter raiz, EMPTY

  Default   

Dessa forma: qualquer coisa é redirecionada para esse servlet, incluindo imagens, etc, por exemplo, abro outra pagina, essa mostra essa, root, ai eu consigo ver no log 4 mais request para a mesma pagina, 3 para css e uma para imagem .

  Default /