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.
Parte 2: 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:
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!
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>
}
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!
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.