1.1. nodaļa: HTTP un Web serveri

Mērķi

  • Iepazīties ar HTTP protokola hederiem
  • Iepazīties ar servleta vides mainīgajiem jeb t.s. CGI mainīgajiem
  • HTTP atgriešanās kodi un ar tiem panākamie efekti
  • Web servera logfaili

Par HTTP protokolu

  • HTTP (HyperText Transfer Protocol)
  • HTTP protokola sākotnējo versiju piedāvāja T.B.Lee; HTTP ir Weba pamatprotokols; tas radās 90-to gadu sākumā, vienlaikus ar valodu HTML, URL adresēm, pirmajiem Web serveriem un Web klientiem un kopš 1995 pārspēja FTP un citus protokolus pēc trafika apjoma Internetā.
  • Pašreizējā versija: HTTP 1.1 ir specificēts RFC2616 dokumentā, sk. http://www.w3.org/Protocols/rfc2616/rfc2616.html; tas sīkāk aprakstīts W3C mājaslapā: http://www.w3.org/Protocols/
  • HTTP kā stabilu veidojumu vairs neviens tālāk neattīsta, toties uz šī protokola pamata veidojušies daži citi protokoli: HTTPS (kriptogrāfiski nodrošināts HTTP) un XMLP jeb SOAP
  • HTTP protokols vislabāk iet cauri ugunsmūriem; šī iemesla dēļ IRC, RMI, CORBA utml. protokolus mēdz "tunelēt" pa HTTP - ārējs serveris saņem HTTP pieprasījumus un pārtulko tos citos protokolos

MIME tipi

MIME (Multipurpose Internet Mail Extension)

TipsNozīme
application/pdfAdobes PDF fails
application/x-java-archiveJAR fails
application/x-java-vmJavas CLASS fails
application/zipZIP arhīvs
text/cssCSS fails
text/htmlHTML fails
text/plainVienkārša teksta (TXT) fails
text/xmlXML fails
image/gifGIF bilde
image/jpegJPEG bilde
image/pngPNG bilde

Web serveris norāda atgriežamā faila tipu ("Content-type" hederis); "x-" prefikss apakštipam norāda, ka šis faila tips nav oficiāli reģistrēts. Nākotnē ar divdaļīgiem MIME tipiem var rasties grūtības ("vārdtelpu konflikti"); būtu labāk, ja tie būtu hierarhiski tāpat kā Javas pakotnes.

URLi

URL (Uniform Resource Locator) - šobrīd neformāls termins - adrese dažos populāros protokolos (Web, FTP, Usenet, Gopher). Universālāki termini - URN, URI, utml. Sk. http://www.w3.org/Addressing/

  • Absolūtie URLi: http://www.delfi.lv/news/national/politics/article.php?id=4300951
  • Relatīvie URLi: ../politics/article.php?id=4300951
  • "Pusabsolūtie URLi: /styles/default.css

URLa sintakse:

protokols://[lietotajs:parole@]hosts[:ports]/taka/
    fails.extension[?querystring][#segments]
  • URLam mūžīgi vajadzētu norādīt uz konceptuāli to pašu resursu (piemēram, šīsdienas avīzes numuru), lai gan tur iegūstamais saturs var mainīties
  • Labs URL nav garš - viegli iegaumēt un uzrakstīt uz salvetes

URLs var saturēt konkrētam gadskaitlim piesietu vārda-došanas shēmu

http://www.nsf.gov/cgi-bin/pubsys/browser/odbrowse.pl 
    - "piesiets" tehnoloģijai
http://www.nsf.gov/pubsys/ods/getpub.cfm?nsf9814 
    - URL satur datubāzes ID; šādi URL nav stabili
http://www.nsf.gov/pubs/1998/nsf9814/nsf9814.htm 
    - Līdzīgs URL, tikai pārrakstīts direktoriju formā
http://www.w3.org/TR/2002/REC-xhtml1-20020801/ 
    - W3C izveidots urls - ievērojiet datuma izmantošanu

Cepumiņi

  • Viens no galvenajiem sesijas uzturēšanas līdzekļiem - Web serveris ar cepumiņu iezīmē klientu, lai pazītu nākamo pieprasījumu no klienta
  • Beztermiņa cepumiņi dzīvo uz vienu pārlūkprogrammas sesijas laiku, bet termiņa cepumiņi dzīvo norādīto laiku
  • Cepumiņus var nolasīt tikai tas hosts, kurš tos ir uzlicis, bet "draudzīgu aplikāciju" sadarbība var novest pie tā, ka klienta IDs ir redzams vienlaikus vairākiem hostiem.

HTTP pieprasījuma metodes

  • GET - normāls links vai adreses ierakstīšana pārlūkprogrammas lodziņā, neliela forma
  • POST - liela forma, lietotāja paroļu nosūtītšana, failu augšupielāde
<form action="url-adrese" method="GET">
<input type="text" name="field1">
...
<input type="submit" value="Nosūtīt">
</form>
http://www.google.com/search?ie=UTF-8&q=%C5%A0%C5%86ukurs

HTTP pieprasījuma hederi

Accept
Kādus MIME tipus pārlūkprogramma saprot; atsevišķos gadījumos Web serveris var sūtīt 404 (Page Not Found) kodu, ja pārlūkprogramma nesaprot pieprasītā resursa MIME tipu
Accept-Encoding
Piemēram "gzip" un "compress" - HTTP satura saspiešanas tehnoloģija
Authorization
Klients nosūta savus autorizācijas parametrus
Connection
"keep-alive" vai "close". HTTP 1.1 iespēja veidot ilgstošākas HTTP konekcijas ļauj efektīvāk nosūtīt, piemēram, dokumentu kopā ar bildēm
Content-Length
POST gadījumā - cik daudz formas datu
Cookie
Sīkdatnes, kuras pārlūkprogramma ir saņēmusi
Host
Kurš hosts izdarīja pieprasījumu
Referer
Ja pa linku ejam no Lapas A uz Lapu B, tad GET pieprasījumā lapai B minēts "Referer: Lapas_A_adrese". To var izmantot baneru reklāmas efektivitātes noteikšanai, utml.

Parasti visus šos hederus speciāli uzprogrammēts Web klients var izmainīt pēc patikas.

HTTP atbildes hederi

Cache-Control
"no-cache" norāda, ka nevajag kešot
response.setHeader("Cache-Control", "no-cache"); 
response.setHeader("Pragma", "no-cache"); 
- pēdējais hederis domāts vecākām pārlūkprogrammām
Connection
"keep-alive" vai "close"
Content-Length
Cik garš ir saturs (īpaši svarīgi, ja konekcija paliek atvērta)
Content-Type
MIME tips un kodējums. Piemēram
Content-type: text/html; charset=windows-1257
Expires
Laiks, kad lappuse kļūst novecojusi - milisekundes
Last-Modified
Kad uz servera dokuments pēdējo reizi mainīts
Location
Jaunā lappuses vieta (ja lieto 302 atgr. kodu)
Refresh
Pārlūkprogramma pēc norādītā sekunžu skaita lūdz jaunu - uzlabotu lappusi
response.setIntHeader("Refresh", 30);
Set-Cookie
Uzstāda jaunu cepumiņu

HTTP atgriešanās kodi

200 (OK)
Dokuments tiek sekmīgi nosūtīts
204 (No Content)
Pieprasījums saņemts sekmīgi, bet nenosūta jaunu lapu
302 (Moved Temporarily)
Izmanto kopā ar "Location:" hederi, lai nosūtītu servera puses redirektu
304 (Not Modified)
Serveris nesūta dokumentu, bet liek klientam lietot kešoto versiju
401 (Unauthorized)
Klients nav pareizi uzstādījis "Authorization" hederi
403 (Forbidden)
Serveris neļauj skatīties pieprasīto resursu (piemēram, nav atļauts lasīt direktorijas struktūru)
404 (Not Found)
Visizplatītākais kods
500 (Internal Server Error)
Kļūda servera puses aplikācijā

Logfaili

Web servera piekļuves logfaila atrašanās vieta: c:\tools\jakarta-tomcat-5.0.27\logs\localhost_log.2004-08-07.txt. Tajā var atrast Web klientu (vai Proxy serveru) IP adreses, kad kurš URL pieprasīts, un ar kuru HTTP atgriešanās kodu pieprasījums beidzās.

127.0.0.1 - - [18/Nov/2002:22:56:58 +0200] "GET / HTTP/1.1" 200 2619
127.0.0.1 - - [18/Nov/2002:22:56:59 +0200] "GET /blaf.css HTTP/1.1" 200 5832
127.0.0.1 - - [18/Nov/2002:23:01:00 +0200] "GET /examples/jsp HTTP/1.1" 301 0
127.0.0.1 - - [18/Nov/2002:23:01:00 +0200] "GET /examples/jsp/ HTTP/1.1" 200 7135

exercise41: Cepumiņu tests

Darbības:

  • Failus web_cookie.html, web_cookie1.jsp un web_cookie2.jsp iekopēt direktorijā c:\oc4j\j2ee\home\default-web-app\mysamples\cookies, izsaukt no pārlūkprogrammas URL adresi http://localhost:8888/kalvis/cookie/web_cookie.html.
  • Modificēt failu web_cookie2.jsp tā, lai tas ne vien izdrukātu krāsainu josliņu, bet arī tabulu ar visām cepumiņu vērtībām. Piemēram šādu:
    Cepumiņa vārdsCepumiņa vērtība
    miiljaakaa_kraasa #0011ff
     
  • Ievērojiet, ka daži latviešu modificētie burti var parādīties nekorekti - baitu kodējums var būt ISO-8859-1 par spīti web_cookie2.jsp lapas HEAD elementā norādītajam "Baltic Windows" kodējumam. Nepieciešamības gadījumā pievienojiet web_cookie2.jsp failam pašā sākumā šādu deklarāciju (manuāli uzstādīts atbildes hederis "Content-type"):
    <%@ page contentType="text/html; charset=windows-1257" %>
    

exercise42: Paroles pārbaude un redirekts

Darbības:

  • Izveidot c:\oc4j\j2ee\home\default-web-app\mysamples\paroles
  • Izmēģināt 3 redirekta veidus - klienta puses redirektu un 2 veidus servera puses redirektam. Sk. failus direktorijā exercise42
  • Izveidot vienkāršu HTML formu login.html, kurā lietotājs var ievadīt savu lietotāja vārdu un paroli.
  • Formu nosūtīt JSP lappusei index.jsp, kura pārbauda, vai lietotājs ir "admin" ar paroli "base". Ja ir, tad JSP lapa izvada savu saturu. Ja nav, tad notiek redirekts uz citu lapu: wrong_password.html, kura satur brīdinājumu, ka parole ir nepareiza un linku atpakaļ uz login.html lapu

exercise43: Klienta puses atsvaidzināšana ("Client pull")

  • Ar
    response.setHeader("Refresh", "5"); 
    
    uzprogrammēt servletu, kurš nosūta klientam servera puses pulksteni un pēc tam turpina to nosūtīt ik pēc 5 sekundēm
  • Minimālais servleta kods ir te:
    import java.io.*;
    import javax.servlet.*;
    import javax.servlet.http.*;
    public class PlainServlet extends HttpServlet { 
        public void doGet (HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException { 
    
            resp.setContentType("text/plain"); 
            ServletOutputStream out = resp.getOutputStream(); 
            out.println("xxx"); 
        }
    }
    
    Laika noskaidrošanai var izmantot funkciju new Date().

Lapa mainīta 2004-11-15 22:37:53