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.

