Redirecionamento de páginas e domínios com Jetty Rewrite Handler

O presente artigo aborda o redirecionamento de páginas e domínios com tratamento de variáveis GET e POST em servidor Jetty.

[ Hits: 18.540 ]

Por: Marcelo em 12/04/2010


Criação de um aplicativo web - Tratamento de variáveis POST e GET



Bom, até hoje ainda não encontrei uma maneira de tratar a passagem das variáveis POST e GET por xml, isto ocorre porque o rewrite handler até que faz o forward das variáveis, o que ele não faz é tratá-las, ou seja, uma página como:

teste/pagina?id=4

É redirecionada para:

teste/redirect?id=4

Mas não era isso que eu queria, o que eu queria era:

teste/pagina?id=4

Para:

teste/redirect?id=73

E isso eu não consegui fazer por xml, logo a solução que encontrei foi a criação de um war para tratamento dos POST e GET.

Entre em um IDE de sua preferência, no meu caso NetBeans e crie uma nova aplicação web.

Depois de criá-la não esqueçam de colocar nomes dos quais irão se lembrar, pois o URI deles é muito importante. No meu caso criei uma aplicação com o nome "Redirecionador".

Agora crie um Servlet de nome Redirect.

Nela iremos importar um jar do Jetty para podermos desenvolver o aplicativo para o mesmo. O jar se encontra em $JETTY_HOME/lib/jetty-6.1.20.jar. Copie ou mande o Netbeans importar esta lib e dentro do Servlet Redirect copie e cole o código:

//Redirect.java:
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
//Sem o import do jar do jetty este import abaixo falhará
import org.mortbay.jetty.servlet.DefaultServlet;
/**
*
* @author marcelo.m87
*/

public class Redirect extends DefaultServlet {
  
    /**
     * Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */

    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
            try{
                //Aqui é onde tratamos nossas variáveis, no meu caso usarei uma variável get de nome id
                switch(Integer.parseInt(request.getParameter("id")))
                {
                    //Aqui cuidamos do redirecionamento e tratamento da variável id
                    case 1: response.sendRedirect("http://www.paginaaserredirecionada.com/index.php?id=23");

                    default: response.sendRedirect("http://www.paginaaserredirecionada.com/index.php");

                }
            }catch(Exception e){
                response.sendRedirect("http://www.paginaaserredirecionada.com/index.php");
            }
    }

    // <editor-fold defaultstate="collapsed" desc="Métodos HttpServlet. Clique no sinal de + à esquerda para editar o código.">
    /**
     * Handles the HTTP <code>GET</code> method.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        processRequest(request, response);
    }

    /**
     * Handles the HTTP <code>POST</code> method.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        processRequest(request, response);
    }

    /**
     * Returns a short description of the servlet.
     * @return a String containing servlet description
     */

    @Override
    public String getServletInfo() {
        return "Short description";
    }// </editor-fold>

}

Pronto, agora teremos que simplesmente mandar compilar para que o war seja criado. No caso do NetBeans use o build.

Terminado o build copiemos o nosso war para ser executado pelo Jetty.

Usarei o caminho padrão do Netbeans, aplique de acordo com seu IDE:

cp ~/NetBeansProjects/Redirecionador/dist/Redirecionador.war /usr/share/jetty/webapps

Ou se você possuir setadas as variáveis de ambiente:

cp ~/NetBeansProjects/Redirecionador/dist/Redirecionador.war $JETTY_HOME/webapps

Pronto, agora só falta o rewrite handler!

Página anterior     Próxima página

Páginas do artigo
   1. Jetty - simplesmente operando por linha de comando - simplificado
   2. Criação de um aplicativo web - Tratamento de variáveis POST e GET
   3. Jetty - Rewrite Handler
Outros artigos deste autor

Oracle-XE servidor com acesso ssh - Debian Lenny 5.0

VPN com PPTP + DDCLIENT em Debian 5.0 Lenny com IP dinâmico

Leitura recomendada

Busca corporativa com Apache Solr - Motivação e conceitos

Windowbuilder, o plugin do Google para trabalhar com interface gráfica no Eclipse

Java: Usando JInternalFrame de forma elegante

Trabalhando com a interface gráfica em Java

Jmeter com qualidade e performance

  
Comentários
[1] Comentário enviado por eduveks em 14/04/2010 - 14:20h

Vc tem os endereços em hardcode no servlet, basicamente um redirect feito a força bruta.

Isto não bem um rewrite, pois se vier mais dados por post ou por get simplismente irão para o espaço.

Não vejo utilidade prática, basicamente uma martelada, que podia ser feita de forma mais elegante usando o Nginx, veja como usar o Nginx com o Jetty, há um grande ganho de performance, e controle. Isto que vc fez ai no Jetty vc fazia no Nginx sem espinhas, e mantinha o Jetty por trás, fazendo proxy reverso.

Por acaso nunca usei o org.mortbay.jetty.handler.rewrite.RewritePatternRule, no replacement ele não suporta passar um parâmetro Get? Se suportar não era preciso fazer um servlet só para isto, bem se o Jetty não faz isto, o que acho muito estranho, poderia ser feito no Nginx e só terias a ganhar.

E para manter isto, caso vc precise de mias situações destas não é nada prático assim, ter que ficar editando código java e compilando e fazendo deploy... só por causa disto, que é uma situação de configuração de rewrite banal.

Mas esta valendo. Abraço.

[2] Comentário enviado por marcelo.m87 em 15/04/2010 - 08:32h

Blz cara vou dar uma estudada no que vc disse.
Mas fica a dica ae pra quem não quiser usar meu método.
Vlewzaum ae!
Abras e viva o linux!

[3] Comentário enviado por Márcio Léo em 25/01/2011 - 16:51h

Cara a dica é muito boa,tanto que o artigo obteve nota 10.É bastante prático e funcional.Me ajudou bastante.
Parabéns pelo seu artigo!

[4] Comentário enviado por Márcio Léo em 09/02/2011 - 14:50h

Tem alguma configuração que tem que fazer para o redirecionador ser enxergado?O redirecionador que eu fiz funciona localmente mais quando é colocado no servidor não redireciona os links quebrados.

[5] Comentário enviado por marcelo.m87 em 09/02/2011 - 17:24h

Cara eu usei este esquema em um site na web mesmo.
Da uma olhada se num ta com alguma coisinha errada no seu jetty ou faltando algum xml, ou um conflito com os mesmos.
Blz?
Abras!

[6] Comentário enviado por marcelo.m87 em 09/02/2011 - 17:25h

Outra coisa use links completos, não use coisas para redirecionamento como, "/" "./", use a raiz com o site que quer redirecionar.

[7] Comentário enviado por Márcio Léo em 11/02/2011 - 09:33h

Marotta tipo aquele redirecionamento que vc fez pro site de alarmes,eles querem que eu faça um pro site da mutuos...tipo na hora que você inicia o jetty ele abre o redirecionador,mas não o executa.vo posta o redirect aqui:

Redirecionador:
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.mortbay.jetty.servlet.DefaultServlet;

/**
*
* @author marcelo
*/
public class Redirect extends DefaultServlet {

/**
* Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods.
* @param request servlet request
* @param response servlet response
* @throws ServletException if a servlet-specific error occurs
* @throws IOException if an I/O error occurs
*/
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
try {

int parametro = Integer.parseInt(request.getParameter("idSecao"));

if (parametro == 8 || parametro == 10) {
if (parametro == 8) {
response.sendRedirect("http://www.mutuos.com.br/mutuos/Pagina.do?idSecao=12");
} else if (parametro == 10) {
response.sendRedirect("http://www.mutuos.com.br/mutuos/Pagina.do?");
}
}


/*switch (Integer.parseInt(request.getParameter("idSecao"))) {
case 8:
response.sendRedirect("http://www.mutuos.com.br/mutuos/Pagina.do?idSecao=12");
break;


case 10:
response.sendRedirect("http://www.mutuos.com.br/mutuos/Pagina.do?");
break;

default:
response.sendRedirect("http://www.mutuos.com.br/mutuos/pagina.do?");

}*/

} catch (Exception e) {
response.sendRedirect("http://www.mutuos.com.br");
}
}

// <editor-fold defaultstate="collapsed" desc="Métodos HttpServlet. Clique no sinal de + à esquerda para editar o código.">
/**
* Handles the HTTP <code>GET</code> method.
* @param request servlet request
* @param response servlet response
* @throws ServletException if a servlet-specific error occurs
* @throws IOException if an I/O error occurs
*/
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}

/**
* Handles the HTTP <code>POST</code> method.
* @param request servlet request
* @param response servlet response
* @throws ServletException if a servlet-specific error occurs
* @throws IOException if an I/O error occurs
*/
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}

/**
* Returns a short description of the servlet.
* @return a String containing servlet description
*/
@Override
public String getServletInfo() {
return "Short description";
}// </editor-fold>
}


Xml:

<?xml version="1.0"?>
<!DOCTYPE Configure PUBLIC "-//Mort Bay Consulting//DTD Configure//EN" "http://jetty.mortbay.org/configure.dtd">;

<!-- =============================================================== -->
<!-- Mixin the RewriteHandler -->
<!-- =============================================================== -->


<Configure id="Server" class="org.mortbay.jetty.Server">

<!-- =========================================================== -->
<!-- Configure Rewrite Handler -->
<!-- =========================================================== -->
<Get id="oldhandler" name="handler"/>

<Set name="handler">
<New id="Rewrite" class="org.mortbay.jetty.handler.rewrite.RewriteHandler">

<Set name="handler"><Ref id="oldhandler"/></Set>
<Set name="rewriteRequestURI">true</Set>
<Set name="rewritePathInfo">false</Set>
<Set name="originalPathAttribute">requestedPath</Set>

<Set name="rules">
<Array type="org.mortbay.jetty.handler.rewrite.Rule">

<!-- return an error message if low on threads; put this at the top so it will be processed first -->
<Item>
<New id="lowThreads" class="org.mortbay.jetty.handler.rewrite.LowThreadsRuleContainer">
<!-- set the trigger for low threads ridiculously low
uncomment the block below to see it in action -->
<!--Ref id="Server">
<Get id="serverThreadPool" name="threadPool">
<Set name="minThreads">3</Set>
<Set name="maxThreads">4</Set>
<Set name="lowThreads">0</Set>
</Get>
</Ref>

<Set name="threadPool"><Ref id="serverThreadPool"/></Set-->

<Call name="addRule">
<Arg>
<New id="busyresponse" class="org.mortbay.jetty.handler.rewrite.ResponsePatternRule">
<Set name="pattern">/*</Set>
<Set name="code">500</Set>
<Set name="reason">Server busy</Set>
</New>
</Arg>
</Call>
</New>
</Item>

<!-- Add rule to protect against IE ssl bug -->
<Item>
<New class="org.mortbay.jetty.handler.rewrite.MsieSslRule"/>
</Item>

<!-- protect favicon handling -->
<Item>
<New class="org.mortbay.jetty.handler.rewrite.HeaderPatternRule">
<Set name="pattern">/favicon.ico</Set>
<Set name="name">Cache-Control</Set>
<Set name="value">Max-Age=3600,public</Set>
<Set name="terminating">true</Set>
</New>
</Item>


<!-- add a regex rule -->
<Item>
<New class="org.mortbay.jetty.handler.rewrite.RewriteRegexRule">
<Set name="regex">/mutuos/(.*)</Set>
<Set name="replacement">/Redirecionador/Redirect</Set>
</New>
</Item>

<!-- add a header pattern rule -->
<Item>
<New id="header" class="org.mortbay.jetty.handler.rewrite.HeaderPatternRule">
<Set name="pattern">*.jsp</Set>
<Set name="name">Server</Set>
<Set name="value">Server for JSP</Set>
</New>
</Item>


</Array>
</Set>
</New>
</Set>

</Configure>

Foi mal ta te encheno mais o pessoal aqui ta em cima e eu não sei mais o que fazer!!!
Forte abraço!!!
Márcio!!!


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts