Patrón Request­ Send­ Redirect con Servlet Java

David Galisteo Cantero

El patrón “Request Send Redirect” es ampliamente utilizado en el mundo del desarrollo web, sobre todo en aplicaciones cuyas transacciones son de gran trascendencia, por ejemplo, tiendas online.

Pongamos un caso, imaginemos que tenemos una tienda online, y un usuario está rellenando un formulario para el pago de un producto, el formulario se envía por el método “POST”. Una vez enviado el formulario, ¿Qué pasa si el usuario pulsa el botón “atrás” o recarga la página? Debemos tener algún mecanismo que evite que se vuelva a repetir la transacción, el usuario podría estar pagando dos veces por el mismo producto, cosa que no le generará un buen sabor de boca. Por defecto, los navegadores incluyen algunos mecanismos para evitar este tipo de situaciones, el típico mensaje de “reenviar formulario”, pero, ¿Y si el usuario no lee el mensaje?, nunca está de más prevenir este posible “fallo” y no dejar que el usuario actúe “de buena fe”.

Bien, en esta entrada vamos a ver cómo subsanar esta situación haciendo uso de un Servlet (controlador) y varias vistas.

Para comenzar, creamos un proyecto web en Netbeans:
crear proyecto web netbeans

 

A continuación vamos a crear un Servlet, el cual será nuestro controlador:
crear servlet java

Una vez hecho esto, vamos a crear un archivo html (en el directorio Web Pages del proyecto) que contenga un formulario, para el ejemplo simplemente tendremos un botón “Pagar”:

<\form action="pagar" method="POST">
     <\input type="submit" id="botonEnvio" value="Pagar">
<\form>

Nota: Eliminar el carácter ‘\’

“pagar” es el nombre que le pusimos a nuestro servlet.

Bien, a continuación vamos con la programación del servlet, estos, implementan un método “doGet” para peticiones GET, y un “doPost” para peticiones POST, por lo que tendremos que sobreescribir el método “doPost”, ahora tenemos dos opciones para hacer la redirección, o redirigimos al mismo servlet mediante GET (si pulsamos reenviar estaríamos haciendo peticiones GET), o redirigimos a otra vista, que indique que todo se realizó con éxito, vamos a ver la primera.

@Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.sendRedirect("pagar");
    }

En este caso estamos redirigiendo al mismo servlet, pero mediante el método GET, otra opción es:

request.setAttribute("pago", "ok");
request.getRequestDispatcher("/pagoValido.jsp").forward(request,response);

Redirigir a una vista en la cual mostraremos que el pago se realizó correctamente.

Con esta solución nos quitamos de encima el posible reenvio cuando el usuario pulse “recargar”, ya que estaría enviando peticiones GET.

Espero que os haya sido útil.

HackSaludos!

Publicado el 16-02-2014

Compartelo!

Deja un comentario

Comentanos

*
Ir arriba de la pagina