Parámetros, método GET y POST en Servlets

Los parámetros son la forma de que el cliente o usuario pueda enviar información al servidor Http. Por ejemplo en una típica pantalla de login necesitamos enviar el usuario y la clave al servidor para que la valide.

Como hace el cliente o Browser para enviar estos parámetros usando el método GET o POST esta explicado en el tutorial Servidor Web o Servidor HTTP. Lo que vamos a ver en este tutorial es como recuperar esta información en el servidor usando el API Servlet.

Lo primero que vamos a hacer es crear en nuestro sitio una página login.html con el siguiente contenido

<html>
<body>
<form action="login" method="get">
<table>
<tr>
<td>User</td>
<td><input name="user" /></td>
</tr>
<tr>
<td>password</td>
<td><input name="password" /></td>
</tr>
</table>
<input type="submit" />
</form>
</body>
</html>

Lo siguiente es crear un Servlet que reciba la petición en /login que es la dirección indicada en el atributo action de la etiqueta <form> de login.html

package com.edu4java.servlets;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class LoginServlet extends HttpServlet {
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		String user = req.getParameter("user");
		String pass = req.getParameter("password");
		if ("edu4java".equals(user) && "eli4java".equals(pass)) {
			response(resp, "login ok");
		} else {
			response(resp, "invalid login");
		}
	}

	private void response(HttpServletResponse resp, String msg)
			throws IOException {
		PrintWriter out = resp.getWriter();
		out.println("<html>");
		out.println("<body>");
		out.println("<t1>" + msg + "</t1>");
		out.println("</body>");
		out.println("</html>");
	}
}

Compilamos este Servlet e incluimos LoginServlet.class en el directorio /WEB-INF/classes. Modificamos web.xml para enlazar /login con este Servlet.

<web-app>
<servlet>
<servlet-name>timeservlet</servlet-name>
<servlet-class>com.edu4java.servlets.FirstServlet</servlet-class>
</servlet>
<servlet>
<servlet-name>login-servlet</servlet-name>
<servlet-class>com.edu4java.servlets.LoginServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>timeservlet</servlet-name>
<url-pattern>/what-time-is-it</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>login-servlet</servlet-name>
<url-pattern>/login</url-pattern>
</servlet-mapping>
</web-app>

Reiniciamos el servidor, abrimos la pagina login.html, colocamos una x en usuario, una x en password y oprimimos el boton submit.

Como respuesta recibimos

indicándonos que el login ha fallado. Si repetimos la operación con edu4java como user y eli4java como password obtenemos

El problema aquí es que la password secreta queda visible en el URL …/login?user=edu4java&password=eli4java, quedará en el historial del Browser y cualquiera que acceda al Browser después de nosotros podrá obtenerla fácilmente. Esto puede ser solucionado cambiando el método de envío del formulario a POST en login.html.

<html>
<body>
<form action="login" method="post">
<table>
<tr>
<td>User</td>
<td><input name="user" /></td>
</tr>
<tr>
<td>password</td>
<td><input name="password" /></td>
</tr>
</table>
<input type="submit" />
</form>
</body>
</html>

Pero al usar de nuevo login.html recibiremos el siguiente error.

Lo que sucede aquí es que no hemos implementado el método doPost (solo implementamos doGet) por lo que nuestro Servlet no esta capacitado para recibir peticiones POST. El siguiente código muestra la modificación necesaria para que funcione.

package com.edu4java.servlets;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class LoginServlet extends HttpServlet {
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		String user = req.getParameter("user");
		String pass = req.getParameter("password");
		if ("edu4java".equals(user) && "eli4java".equals(pass)) {
			response(resp, "login ok");
		} else {
			response(resp, "invalid login");
		}
	}

	private void response(HttpServletResponse resp, String msg)
			throws IOException {
		PrintWriter out = resp.getWriter();
		out.println("<html>");
		out.println("<body>");
		out.println("<t1>" + msg + "</t1>");
		out.println("</body>");
		out.println("</html>");
	}
}

El único cambio es que reemplacé doGet por doPost. Después de recompilar y desplegar el Servlet, reiniciar el servidor y volver a utilizar login.html obtenemos

Donde podemos ver que han desaparecido los parámetros del URL.

<< Primer Servlet, estructura de un sitio web según estándar J2EE Uso de Eclipse IDE for Java EE Developers >>