Servlets y JSP

Cuando un cliente HTTP (por ejemplo, un navegador) env�a una petici�n, se pide que suministre una l�nea de petici�n (normalmente GET o POST). Si se quiere tambi�n puede enviar un n�mero de cabeceras, que son opcionales excepto Content-Length, que es requerida s�lo para peticiones POST. Aqu� tenemos las cabeceras m�s comunes:

  • Accept Los tipos MIME que prefiere el navegador.
  • Accept-Charset El conjunto de caracteres que espera el navegador.
  • Accept-Encoding Los tipos de codificaci�n de datos (como gzip) para que el navegador sepa como decoficarlos. Los servlets pueden chequear expl�citamente el soporte para gzip y devolver p�ginas HTML comprimidas con gzip para navegadores que las soportan, seleccionando la cabecera de respuesta Content-Encoding para indicar que est�n comprimidas con gzip. En muchos casos, esto puede reducir el tiempo de descarga por un factor de cinco o diez.
  • Accept-Language El idioma que est� esperando el navegador, en el caso de que el servidor tenga versiones en m�s de un idioma.
  • Authorization Informaci�n de autorizaci�n, usualmente en respuesta a una cabecera WWW-Authenticate desde el servidor.
  • Connection �Usamos conexiones persistentes? S� un servlet obtiene un valor Keep-Alive aqu�, u obtiene una l�nea de petici�n indicando HTTP 1.1 (donde las conexiones persistentes son por defecto), podr�a ser posible tomar ventaja de las conexiones persisentes, ahorrando un tiempo significante para las p�ginas Web que incluyen muchas piezas peque�as (im�genes o clases de applets). Para hacer esto, necesita env�ar una cabecera Content-Length en la respuesta, que es f�cimente conseguido escribiendo en un ByteArrayOutputStream, y preguntando por el tama�o antes de escribir la salida.
  • Content-Length (para mensajes POST, c�antos datos se han a�adido)
  • Cookie (una de las cabeceras m�s importantes, puedes ver la secci�n independiente de esta tutorial dedicada a los Cookies) .
  • From (direcci�n email del peticionarios; s�lo usado por aceleradores Web, no por clientes personalizados ni por navegadores)
  • Host (host y puerto escuchado en la URL original)
  • If-Modified-Since (s�lo devuelve documentos m�s nuevos que �ste, de otra forma se env�a una respuesta 304 "Not Modified" response)
  • Pragma (el valor no-cache indica que el servidor deber�a devolver un documento nuevo, incluso si es un proxy con una copia local)
  • Referer (la URL de la p�gina que contiene el enlace que el usuario sigui� para obtener la p�gina actual)
  • User-Agent (tipo de navegador, �til si el servlets est� devolviendo contenido espec�fico para un navegador)
  • UA-Pixels, UA-Color, UA-OS, UA-CPU (cabeceras no est�ndard env�adas por algunas versiones de Internet Explorer, indicando el tama�o de la pantalla, la profundidad del color, el sistema operativo, y el tipo de CPU usada por el sistema del navegador)

Para ver todos los detalles sobre las cabeceras HTTP, puedes ver las especificaciones en http://www.w3.org/Protocols/.

.�Leer Cabeceras de Solicitud desde Servlets

Leer cabeceras es muy sencillo, s�lo llamamos al m�todo getHeader de HttpServletRequest, que devuelve un String si se suministr� la cebecera en esta petici�n, y null si no se suministr�. Sin embargo, hay un par de cabeceras que se usan de forma tan com�n que tienen m�todos de acceso especiales. El m�todo getCookies devuelve el contenido de la cabecera Cookie, lo analiza y lo almacena en un array de objetos Cookie. Los m�todos getAuthType y getRemoteUser dividen la cabecera Authorization en su componentes. Los m�todos getDateHeader y getIntHeader leen la cabecera espec�fica y la convierten a valores Date e int, respectivamente.

En vez de buscar una cabecera particular, podemos usar el getHeaderNames para obtener una Enumeration de todos los nombres de cabecera de esta petici�n particular.

Finalmente, adem�s de buscar las cabeceras de petici�n, podemos obtener informaci�n sobre la propia l�nea de petici�n principal. El m�todo getMethod devuelve el m�todo de petici�n principal (normalmente GET o POST, pero son posibles cosas como HEAD, PUT, y DELETE). El m�todo getRequestURI devuelve la URI (la parte de la URL que viene despu�s del host y el puerto, pero antes de los datos del formulario). El getRequestProtocol devuelve la tercera parte de la l�nea de petici�n que generalmente es "HTTP/1.0" o "HTTP/1.1".

.�Ejemplo: Imprimir todas las Cabeceras

Aqu� tenemos un servelt que simplemente crea una tabla con todas las cabeceras recibidas, junto con sus valores asociados. Tambi�n imprime los tres componentes de la l�nea de petici�n principal (m�todo, URI y protocolo).

.�ShowRequestHeaders.java

Tambi�n puedes descargar el c�digo fuente

package hall;

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.*;

public class ShowRequestHeaders extends HttpServlet {
  public void doGet(HttpServletRequest request,
                    HttpServletResponse response)
      throws ServletException, IOException {
    response.setContentType("text/html");
    PrintWriter out = response.getWriter();
    String title = "Servlet Example: Showing Request Headers";
    out.println(ServletUtilities.headWithTitle(title) +
                "<BODY BGCOLOR=\"#FDF5E6\">\n" +
                "<H1 ALIGN=CENTER>" + title + "</H1>\n" +
                "<B>Request Method: </B>" +
                request.getMethod() + "<BR>\n" +
                "<B>Request URI: </B>" +
                request.getRequestURI() + "<BR>\n" +
                "<B>Request Protocol: </B>" +
                request.getProtocol() + "<BR><BR>\n" +
                "<TABLE BORDER=1 ALIGN=CENTER>\n" +
                "<TR BGCOLOR=\"#FFAD00\">\n" +
                "<TH>Header Name<TH>Header Value");
    Enumeration headerNames = request.getHeaderNames();
    while(headerNames.hasMoreElements()) {
      String headerName = (String)headerNames.nextElement();
      out.println("<TR><TD>" + headerName);
      out.println("    <TD>" + request.getHeader(headerName));
    }
    out.println("</TABLE>\n</BODY></HTML>");
  }

  public void doPost(HttpServletRequest request,
                     HttpServletResponse response)
      throws ServletException, IOException {
    doGet(request, response);
  }
}

.�Salida de ShowRequestHeaders

Aqu� est�n los resultados de dos peticiones t�picas, una de Netscape y otra de Internet Explorer. Veremos la raz�n por la que Netscape muestra una cabecera Cookie cuando lleguemos a la secci�n Cookies.

COMPARTE ESTE ARTÍCULO

COMPARTIR EN FACEBOOK
COMPARTIR EN TWITTER
COMPARTIR EN LINKEDIN
COMPARTIR EN WHATSAPP
ARTÍCULO ANTERIOR