Activitats

La capçalera de la petició

L’objectiu d’aquesta activitat és aprofundir en l’aprenentatge del protocol HTTP amb la utilització de servlets per analitzar la capçalera d’una petició.

Implementeu un servlet que mostri en una pàgina el missatge GET o POST que hagi rebut amb totes les capçaleres i els paràmetres enviats.

La solució de l’exercici la podeu descarregar en aquest

enllaç ( 6.8 KB )
.

Començarem l’activitat creant un nou projecte Maven. Aneu a File / New Project / Maven / Web Application. Si voleu, esborreu el fitxer index.php, ja que no el necessitarem. A continuació, creeu un servlet nou i modifiqueu la funció processRequest perquè contingui el següent codi:

  1. protected void processRequest(HttpServletRequest request, HttpServletResponse response)
  2. throws ServletException, IOException {
  3. response.setContentType("text/html");
  4.  
  5. PrintWriter out = response.getWriter();
  6. String title = "Exemple de petició HTTP";
  7. String docType
  8. = "<!doctype html public \"-//w3c//dtd html 4.0 "
  9. + "transitional//en\">\n";
  10. out.println(docType
  11. + "<html>\n"
  12. + "<head><title>" + title + "</title></head>\n"
  13. + "<body bgcolor=\"#f0f0f0\">\n"
  14. + "<h1 align=\"center\">" + title + "</h1>\n"
  15. + "<table width=\"100%\" border=\"1\" align=\"center\">\n"
  16. + "<tr bgcolor=\"#949494\">\n"
  17. + "<th>Nom del paràmetre de la capçalera de la petició</th><th>Valor(s)</th>\n"
  18. + "</tr>\n");
  19.  
  20. Enumeration headerNames = request.getHeaderNames();
  21.  
  22. while (headerNames.hasMoreElements()) {
  23. String paramName = (String) headerNames.nextElement();
  24. out.print("<tr><td>" + paramName + "</td>\n");
  25. String paramValue = request.getHeader(paramName);
  26. out.println("<td> " + paramValue + "</td></tr>\n");
  27. }
  28. out.println("</table>\n</body></html>");
  29. }

En executar el servlet anterior us apareixerà la informació que podeu veure en la figura:

Figura Capçalera de la petició

La figura ens mostra tot un llistat de paràmetres que el navegador ha enviat al servidor quan ha demanat el recurs. Aquest recurs és l’URL del servlet que hem creat per donar una solució a l’activitat.

Tots aquests paràmetres s’envien automàticament sense que el mateix usuari sàpiga que s’han enviat i el servidor els pot llegir per donar una resposta més acurada al client que l’ha demanat.

Els paràmetres que s’han enviat han estat:

  • host: correspon amb la IP i el port del servidor al qual el navegador ha accedit per obtenir una pàgina web.
  • connection: paràmetre que indica al servidor què ha de fer amb la connexió HTTP establerta. En aquest cas, l’opció keep-alive vol reaprofitar la connexió per a futures peticions.
  • accept: indica quines respostes accepta. Sempre són dos valors type/subtype, per exemple, text/html.
  • include-insecure-headers: indica al servidor la preferència de navegar amb HTPPS. Si es troba a “1”, el servidor té el permís del client per establir una connexió segura amb el protocol HTTPS. Si finalment s’estableix una connexió segura, el servidor ha d’incloure un paràmetre addicional anomenat strict-transport-security (HSTS-Safe).
  • user-agent: indica quin és el navegador utilitzat pel client en fer la petició.
  • accept-encoding: indica al servidor quina codificació accepta en la resposta. Per exemple, pot acceptar pàgines comprimides en Gzip.
  • accept-language: indica al servidor l’idioma preferit per l’usuari per visualitzar una pàgina.
  • dnt: també conegut com do not track. Si està activat, indica al servidor que l’usuari vol desactivar el seu seguiment (tracking). És un paràmetre de seguretat que activa l’usuari per indicar que no vol que rastregin la seva petició. Igualment, depèn de l’honorabilitat dels servidors fer cas d’aquesta petició.

Com podeu suposar, existeixen molts més paràmetres. Podeu veure tots els paràmetres que es poden enviar en aquest enllaç.

Tornant a l’exemple, fixeu-vos com s’han obtingut els paràmetres de capçalera de la petició:

  1. Enumeration headerNames = request.getHeaderNames();

Amb aquesta instrucció s’ha obtingut una col·lecció d’elements que corresponen als noms dels paràmetres de la capçalera de la petició (host, connection…).

Per aconseguir un a un els paràmetres enviats només s’ha d’executar el mètode nextElement().

  1. String paramName = (String) headerNames.nextElement();

Finalment, amb la instrucció

  1. String paramValue = request.getHeader(paramName);

es recupera el valor associat a aquest paràmetre i es poden mostrar en forma de taula.

La capçalera de la resposta

L’objectiu d’aquesta activitat és aprofundir en l’aprenentatge del protocol HTTP amb la utilització de servlets per analitzar la capçalera de resposta en fer una petició HTTP.

Implementeu un servlet que accedeixi a la pàgina ioc.xtec.cat i mostri la capçalera de la resposta que hagi rebut amb tots els paràmetres.

La solució de l’exercici la podeu descarregar en aquest

enllaç ( 6.8 KB )
.

Començarem l’activitat creant un nou projecte Maven. Aneu a File / New Project / Maven / Web Application. Si voleu, esborreu el fitxer index.php, ja que no el necessitarem. A continuació, creeu un servlet nou i modifiqueu la funció processRequest perquè contingui el següent codi:

  1. protected void processRequest(HttpServletRequest request, HttpServletResponse response)
  2. throws ServletException, IOException {
  3.  
  4. response.setContentType("text/html");
  5. response.setContentType("text/html;charset=UTF-8");
  6. PrintWriter out = response.getWriter();
  7. out.println("<!DOCTYPE html>");
  8. out.println("<html>");
  9. out.println("<head>");
  10. out.println("<title>Capçalera de la resposta</title>");
  11. out.println("</head>");
  12. out.println("<body>");
  13.  
  14. out.println("<h1>Capçalera de la resposta...\n</h1>");
  15.  
  16. out.println("<h3>Capçalera de la resposta del servidor ioc.xtec.cat en accedir al web: \n</h3>");
  17.  
  18. out.println("<table width=\"100%\" border=\"1\" align=\"center\">\n");
  19. out.println("<tr bgcolor=\"#1acff6\">\n");
  20. out.println("<th>Nom del paràmetre de la capçalera</th><th>Valor(s)</th>\n");
  21. out.println("</tr>\n");
  22.  
  23. URL obj = new URL("http://ioc.xtec.cat");
  24. URLConnection conn = obj.openConnection();
  25. Map<String, List<String>> map = conn.getHeaderFields();
  26.  
  27. for (Map.Entry<String, List<String>> entry : map.entrySet()) {
  28. String paramName = (String) entry.getKey();
  29. out.print("<tr><td>" + paramName + "</td>\n");
  30. out.println("<td> " + entry.getValue() + "</td></tr>\n");
  31.  
  32. }
  33. out.println("</table>");
  34. out.println("</body>");
  35. out.println("</html>");
  36. }

En executar el servlet anterior us apareixerà la informació que podeu veure en la figura:

Figura Capçalera de la resposta de la petició d’un recurs

La figura ens mostra tot un llistat de paràmetres que el servlet ha rebut en enviar una petició al servidor ioc.xtec.cat.

Els paràmetres que s’han rebut son:

  • keep-Alive: indica amb el valor timeout el temps que el servidor mantindrà la connexió oberta mentre no s’enviï cap altra petició. I amb el valor max indica el nombre màxim de peticions que admet del client per a aquesta connexió.
  • null - HTTP1.1/ 200 ok: indica el protocol que ha fet servir per a la connexió (http 1.1) i l’estat (200) de la connexió (OK).
  • Server: el servidor web que ha generat la resposta de la petició.
  • Connection: l’estat de la connexió. En aquest cas es queda oberta perquè el client continuï fent peticions.
  • Last-Modified: l’ultima vegada que es va modificar la pàgina web que s’ha demanat.
  • Date: dia i hora en què la resposta va ser enviada.
  • Accept-Ranges: és la unitat mínima d’informació que s’envia. Normalment, la informació s’envia en blocs de X bits. En aquest cas, envia la informació agrupada en bytes.
  • Cache-Contol: informa el servidor durant quants segons la resposta és vàlida.
  • ETag: correspon a l’identificador del recurs demanat.
  • Set-Cookie: correspon a la cookie que el servidor emmagatzema a l’ordinador del usuari
  • Expires: indica el dia i la hora fins a la qual la resposta és vàlida.
  • Content-length: indica la longitud, en octets, del body de la pàgina demanada.
  • Content-Language: indica l’idioma de la pàgina web que s’ha demanat.
  • Content-Type: indica el tipus d’informació que s’envia al client. Exemple: text/html.

Podeu veure tots els paràmetres que es poden rebre en aquest enllaç.

Per crear una connexió HTTP a un servidor web s’ha fet servir aquest codi:

  1. URL obj = new URL("http://ioc.xtec.cat");
  2. URLConnection conn = obj.openConnection();

Una vegada s’ha establert la connexió es pot demanar la capçalera que envia el servidor de l’IOC amb la següent instrucció:

  1. Map<String, List<String>> map = conn.getHeaderFields();

Retorna un conjunt de dades que té l’estructura clau:valor, on la clau és el primer paràmetre i el valor és una llista de valors. Per recórrer aquesta estructura es fa servir un bucle de tipus foreach. A Java, aquests bucles s’implementen de la següent manera:

  1. for (Map.Entry<String, List<String>> entry : map.entrySet()) {
  2.  
  3. }

La variable entry a cada iteració tindrà un parell clau:valor diferent de l’objecte map.

Per accedir a la clau, que correspon al nom del paràmetre enviat a la capçalera de la resposta, s’utilitza el següent codi:

  1. String paramName = (String) entry.getKey();

Per obtenir el valor o valors associats al paràmetre anterior s’utilitza la següent instrucció:

  1. out.println("<td> " + entry.getValue() + "</td></tr>\n");

Mentre es van recuperant els valors, es va construint la taula que el servlet enviarà al client.

Anar a la pàgina anterior:
'Servlets'
Anar a la pàgina següent:
Exercicis d'autoavaluació