Prisutnost c ploča cgi. Programiranje s CGI. Kako CGI radi
Andover, Massachusetts, 19. studenog 2003
Commerce Group, Inc. (NYSE: CGI), najveći pisac privatnih osiguranja osobnih automobila u Massachusettsu i CGI Group Inc. (CGI) (TSX: GIB.A; NYSE: GIB;), vodeći pružatelj usluga informacijske tehnologije i poslovne obrade, najavio je danas potpisivanje šestogodišnjeg ugovora o eksternalizaciji poslovnih procesa (BPO) u vrijednosti od 35 milijuna američkih dolara. CGI će pružiti potpune usluge obrade politike za privatne putničke i komercijalne automobilske linije u Massachusettsu, kao i pružanje CGI-jevog alata za agencijsko sučelje CollaborativeEdge, podršku i održavanje aplikacija, regulatornu podršku, savjetovanje sustava i usluge upravljanja dokumentima.
Gerald Fels, izvršni potpredsjednik i financijski direktor Commerce Groupa, izjavio je: „Kao vodeći ponuđač osobnih osobnih automobila u Massachusettsu, naš je cilj pružiti našim agentima i zaposlenicima usluge koje im pomažu da rade na najvišoj razini. Tijekom godina njegovali smo čvrst odnos s CGI-jem. Njihov je sustav robustan i točan, a njihov tim je vrlo upoznat s našim internim sustavima obrade. To nam je važno."
Serge LaPalme, predsjednik, usluge osiguranja za CGI, dodao je: "Veoma nam je drago što nastavljamo naš odnos s Commerce Group, odnosom koji se proteže preko 30 godina. Commerce Group nastavlja biti jedan od naših cijenjenih poslovnih partnera i strateški je naš uspjeh. Pomažući našem klijentu da se dalje usredotoči na svoju osnovnu djelatnost, koristimo prednosti novih tehnologija kada i gdje to ima smisla. Naš tim blisko poznaje industriju osiguranja i jedinstveno regulatorno okruženje države i kao rezultat toga brzo se prilagođava postojeća rješenja za ovaj sektor koji se neprestano razvija."
O The Commerce Group, Inc.
Commerce Group, Inc., osiguravajuće holding društvo, ima sjedište u Websteru, Massachusetts. Podružnice za osiguranje imovine i nezgoda tvrtke Commerce Group uključuju The Commerce Insurance Company i Citation Insurance Company u Massachusettsu, Commerce West Insurance Company u Kaliforniji i American Commerce Insurance Company u Ohiju. Kroz svoje podružnice" kombinirane aktivnosti osiguranja, Commerce Group je rangirana kao 22. najveća osobna grupa za osiguranje automobila u zemlji od strane AM Najbolji, na temelju izravnih pisanih premium informacija iz 2002. godine.
O CGI-ju
Osnovan 1976., CGI je peta najveća neovisna tvrtka za pružanje usluga informacijske tehnologije u Sjevernoj Americi, na temelju broja zaposlenih. CGI i njegove pridružene tvrtke zapošljavaju 20.000 stručnjaka. Godišnja stopa prihoda CGI-ja trenutno iznosi 2,8 milijardi CDN (1,9 milijardi USD), a 30. rujna 2003. zaostatak CGI-jevih narudžbi iznosio je 12,3 milijarde CDN (9,1 milijarda USD). CGI pruža sveobuhvatne IT i usluge poslovnih procesa klijentima diljem svijeta iz ureda u Kanadi, Sjedinjenim Državama i Europi. Dionice CGI uvrštene su na TSX (GIB.A) i NYSE (GIB) i uključene su u TSX 100 Composite Index, kao i S&P/TSX kanadske informacijske tehnologije i kanadske MidCap indekse. Web stranica: .
Poglavlje 9.
Programiranje s CGI
Uključivanje odjeljka o CGI-u u knjigu baze podataka može se činiti čudnim kao i imati poglavlje o popravku automobila u kuharici. Naravno, da biste otišli u trgovinu, potreban vam je servisan automobil, ali je li prikladno razgovarati o tome? Potpuni uvod u CGI i web programiranje općenito je izvan dosega ove knjige, ali kratak uvod u ove teme dovoljan je da proširi sposobnost MySQL-a i mSQL-a da predstavlja podatke u području weba.
Ovo poglavlje je uglavnom namijenjeno onima koji uče o bazama podataka, ali bi željeli steći i neka znanja o web programiranju. Ako se prezivate Berners-Lee ili Andressen, malo je vjerojatno da ćete ovdje pronaći nešto što već ne znate. Ali čak i ako niste novi u CGI-u, pri ruci imate brzu referencu dok uranjate u misterije MySQL-a i mSQL-a može biti od velike pomoći.
Što je CGI?
Kao i većina akronima, Common Gateway Interface (CGI je skraćenica od Common Gateway Interface) zapravo ne govori puno. Sučelje s čime? Gdje je ovaj gateway? O kojoj zajednici govorimo? Da bismo odgovorili na ova pitanja, vratimo se malo unatrag i pogledajmo WWW u cjelini.
Tim Berners-Lee, fizičar koji je radio u CERN-u, došao je na web 1990. godine, iako plan datira još iz 1988. godine. Ideja je bila omogućiti istraživačima fizike čestica jednostavnu i brzu razmjenu multimedijskih podataka - teksta, slika i zvuka - putem interneta. WWW se sastojao od tri glavna dijela: HTML, URL i HTTP. HTML- jezik oblikovanja koji se koristi za predstavljanje sadržaja na webu. url- ovo je adresa koja se koristi za dobivanje sadržaja u HTML formatu (ili na neki drugi način) s web poslužitelja. I konačno http- to je jezik koji web poslužitelj razumije i omogućuje klijentima da traže dokumente od poslužitelja.
Mogućnost slanja svih vrsta informacija putem Interneta bila je revolucija, no ubrzo je otkrivena još jedna mogućnost. Ako možete poslati bilo koji tekst preko weba, zašto onda ne možete poslati tekst koji je kreirao program, a nije preuzet iz gotove datoteke? Ovo otvara more mogućnosti. Jednostavan primjer je korištenje programa koji ispisuje trenutno vrijeme tako da čitatelj vidi točno vrijeme svaki put kada pogleda stranicu. Nekoliko pametnih glava u Nacionalnom centru za superračunalske aplikacije (NCSA) koji su gradili web poslužitelj vidjeli su ovu priliku i ubrzo se rodio CGI.
CGI je skup pravila prema kojima programi na poslužitelju mogu slati podatke klijentima putem web poslužitelja. CGI specifikacija bila je popraćena promjenama u HTML-u i HTTP-u koje su uvele novu značajku poznatu kao obrasci.
Dok CGI dopušta programima slanje podataka klijentu, obrasci proširuju ovu mogućnost dopuštajući klijentu slanje podataka tom CGI programu. Sada korisnik ne samo da može vidjeti trenutno vrijeme, već i postaviti sat! CGI oblici otvorili su vrata istinskoj interaktivnosti u svijetu weba. Uobičajene CGI aplikacije uključuju:
- Dinamički HTML. Čitave stranice mogu se generirati pomoću jednog CGI programa.
- Tražilice koje pronalaze dokumente s riječima koje je odredio korisnik.
- Knjige gostiju i oglasne ploče na koje korisnici mogu dodati svoje poruke.
- Obrasci za narudžbu.
- Upitnici.
- Ekstrahiranje informacija iz baze podataka koja se nalazi na poslužitelju.
U sljedećim poglavljima raspravljat ćemo o svim ovim CGI aplikacijama, kao i o nekoliko drugih. Svi oni pružaju izvrsnu priliku za povezivanje CGI-ja s bazom podataka, što nas zanima u ovom dijelu.
HTML obrasci
Prije nego što istražite specifičnosti CGI-ja, korisno je pogledati najčešći način na koji krajnji korisnici dobivaju sučelje za CGI programe: HTML obrasci. Obrasci su dio HTML jezika koji krajnjem korisniku pruža različite vrste polja. Podaci uneseni u polja mogu se poslati na web poslužitelj. Polja se mogu koristiti za unos teksta ili biti gumbi koje korisnik može kliknuti ili označiti. Evo primjera HTML stranice koja sadrži obrazac:
<НТМL><НЕАD><ТITLЕ>Moja stranica obrasca
<р>Ovo je stranica obrasca.
Ovaj obrazac stvara niz od 40 znakova u koji korisnik može unijeti svoje ime. Ispod retka za unos nalazi se gumb, kada se pritisne, podaci obrasca se prenose na poslužitelj. Sljedeće su oznake koje se odnose na obrasce koje podržava HTML 3.2, danas najčešće korišteni standard. Nazivi oznaka i atributa mogu se unijeti u svakom slučaju, ali se pridržavamo opcione konvencije da se početne oznake pišu velikim, a završne malim slovima.
Jedina vrsta unosa koju ovdje nismo koristili je tip IMAGE za oznaku . Može se koristiti kao alternativni način podnošenja obrasca. Međutim, tip IMAGE rijetko je kompatibilan s preglednicima koji se temelje na tekstu i koji slabo reagiraju, stoga ga je razborito izbjegavati osim ako vaša stranica nema bogat grafički stil.
Sada kada ste upoznati s osnovama HTML obrazaca, spremni ste istražiti sam CGI.
CGI specifikacija
Dakle, koji je zapravo "skup pravila" koji CGI programu u, recimo, Batavia, Illinois, omogućuje komunikaciju s web preglednikom u vanjskoj Mongoliji? Službena CGI specifikacija, zajedno s nizom drugih informacija o CGI-u, može se pronaći na NCSA poslužitelju na adresi http://hoohoo . ncsa.uluc.edu/cgi/. Međutim, ovo poglavlje postoji kako ne biste morali dugo putovati i sami ga tražiti.
Postoje četiri načina na koje CGI prosljeđuje podatke između CGI-npor okvira i web poslužitelja, a time i web klijenta:
- varijable okoline.
- Naredbeni redak.
- Standardni ulazni uređaj.
- standardni izlazni uređaj.
S ove četiri metode poslužitelj šalje sve podatke koje je klijent poslao u CGI program. CGI program tada čini svoju magiju i šalje izlaz natrag na poslužitelj, koji ga prosljeđuje klijentu.
Ovi se podaci temelje na Apache HTTP poslužitelju. Apache je najčešće korišteni web poslužitelj i radi na gotovo svim platformama, uključujući Windows 9x i Windows NT. Međutim, mogu se primijeniti na sve HTTP poslužitelje koji podržavaju CGI. Neki vlasnički poslužitelji, poput onih iz Microsofta i Netscapea, mogu imati dodatne značajke ili raditi drugačije. Kako se lice weba nastavlja mijenjati nevjerojatnom brzinom, standardi se još uvijek razvijaju i budućnost će se sigurno promijeniti. Međutim, što se CGI-ja tiče, čini se da je ova tehnologija dobro uhodana - cijena za to je što su je druge tehnologije, poput apleta, istisnule. Svi CGI programi koje napišete koristeći ove informacije gotovo će sigurno moći raditi na većini web poslužitelja dugi niz godina.
Kada se CGI program pozove putem obrasca, najčešćeg sučelja, preglednik šalje poslužitelju dugački niz koji počinje stazom do CGI programa i njegovim imenom. Nakon toga slijede razni drugi podaci, koji se nazivaju informacija o putu, koji se prosljeđuju CGI programu preko PATH_INFO varijable okruženja (slika 9-1). Nakon informacija o stazi slijedi "?", a zatim podaci obrasca, koji se šalju poslužitelju pomoću HTTP GET metode. Ovi podaci su dostupni CGI programu putem QUERY_STRING varijable okoline. Svi podaci koje stranica pošalje koristeći HTTP POST metodu, koja je najčešće korištena, bit će proslijeđeni CGI programu putem standardnog unosa. Tipičan niz koji poslužitelj može primiti od preglednika prikazan je na slici 1. 9-1. imenovani program formread u katalogu cgi-bin poziva poslužitelj s dodatnim informacijama o putu dodatne informacije i podaci zahtjeva za odabir=pomoć - vjerojatno kao dio izvornog URL-a. Konačno, sami podaci obrasca (tekst "CGI programiranje" u polju "ključne riječi") šalju se metodom HTTP POST.
Varijable okoline
Kada poslužitelj izvršava CGI program, on mu prije svega prosljeđuje neke podatke kako bi se pokrenuo u obliku varijabli okruženja. Postoji sedamnaest varijabli službeno definiranih u specifikaciji, ali mnoge se više neslužbeno koriste kroz mehanizam opisan u nastavku pod nazivom HTTP_/nec/zams/n. CGI program
ima pristup tim varijablama baš kao i sve varijable okoline ljuske kada se pokrene iz naredbenog retka. U skripti ljuske, na primjer, varijabli okoline F00 može se pristupiti kao $F00; u Perlu ovaj poziv izgleda kao $ENV("F00") ; u C - getenv("F00") ; i tako dalje. Tablica 9-1 navodi varijable koje uvijek postavlja poslužitelj, čak i ako su null. Osim ovih varijabli, podaci koje je klijent vratio u zaglavlju zahtjeva dodijeljeni su varijablama oblika HTTP_F00 , gdje je F00 naziv zaglavlja. Na primjer, većina web preglednika uključuje informacije o verziji u zaglavlju pod nazivom USEfl_AGENT. Vaš CGI npor framework može dobiti ove informacije iz varijable HTTP_USER_AGENT.
Tablica 9-1.CGI varijable okruženja
varijabla okoline |
Opis |
||
CONTENT_LENGTH |
Duljina podataka proslijeđenih metodama POST ili PUT, u bajtovima. |
||
CONTENT_TYPE |
MIME tip podataka priloženih pomoću metoda POST ili PUT. |
||
GATEWAY_INTERFACE |
Broj verzije CGI specifikacije koju podržava poslužitelj. |
||
PATH_INFO |
Dodatne informacije o putu koje daje klijent. Na primjer, za zahtjev http://www.myserver.eom/test.cgi/this/is/a/ put?polje=zeleno vrijednost varijable PATH_INFO bit će /ovo/je/a/put. |
||
PATH_TRANSLATED |
Isto kao PATH_INFO, ali poslužitelj proizvodi sve |
||
|
Mogući prijevod, na primjer, proširenje naziva poput "-account". » |
||
QUERY_STRING |
Svi podaci nakon "?" u URL-u. Ovo su također podaci proslijeđeni kada je REQ-UEST_METHOD obrasca GET. |
||
REMOTE_ADDR |
IP adresa klijenta koji podnosi zahtjev. |
||
REMOTE_HOST |
Ime hosta klijentskog stroja, ako je dostupno. |
||
REMOTE_IDENT |
Ako web poslužitelj i klijent podržavaju identifikaciju tipa identd, tada je to korisničko ime računa koji podnosi zahtjev. |
||
REQUEST_METHOD |
Metoda koju klijent koristi za podnošenje zahtjeva. Za CGI programe koje ćemo izraditi, to će obično biti POST ili GET. |
||
SERVER_NAME | Ime hosta - ili IP adresa ako ime nije dostupno - stroja na kojem je pokrenut web poslužitelj. | ||
SERVER_PORT | Broj porta koji koristi web poslužitelj. | ||
SERVER_PROTOCOL |
Protokol koji klijent koristi za komunikaciju s poslužiteljem. U našem slučaju, ovaj protokol je gotovo uvijek HTTP. | ||
SERVER_SOFTWARE | Informacije o verziji web poslužitelja na kojem je pokrenut CGI program. | ||
SCRIPT_NAME |
Put do skripte koja će se izvršiti, kako je odredio klijent. Može se koristiti kada se URL odnosi na sebe i tako da se skripte na koje se upućuje na različitim mjestima mogu izvršavati različito ovisno o mjestu. |
||
Evo primjera Perl CGI skripte koja ispisuje sve varijable okruženja koje postavlja poslužitelj, kao i sve naslijeđene varijable, kao što je PATH, koje postavlja ljuska koja je pokrenula poslužitelj.
#!/usr/bin/perl -w
ispisati<< HTML;
Vrsta sadržaja: tekst/html\n\n
HTML
foreach (tipke %ENV) ( ispis "$_: $ENV($_)
\n";)
ispisati<
HTML
Sve ove varijable može se koristiti, pa čak i modificirati vaš CGI program. Međutim, ove promjene ne utječu na web poslužitelj koji je pokrenuo program.
Naredbeni redak
CGI omogućuje prosljeđivanje argumenata CGI programu kao opcije naredbenog retka, što se rijetko koristi. Rijetko se koristi jer je njegova praktična primjena malobrojna i nećemo se detaljnije zadržavati na njoj. Zaključak je da ako varijabla okruženja QUERY_STRING ne sadrži znak "=", tada će se CGI program izvršiti s parametrima naredbenog retka preuzetim iz QUERY_STRING. Na primjer, http://www.myserver.com/cgi- bin/prst?korijen pokrenut će korijen prsta www.myserver.com.
Postoje dvije glavne biblioteke koje pružaju CGI sučelje za Perl. Prvi od njih - cgi-lib.pl Korisnost cgi-lib.pl vrlo čest jer je dugo vremena bila jedina dostupna velika knjižnica. Dizajnirana je za rad u Perlu 4, ali također radi i s Perl 5. Druga biblioteka, CGI.pm, novije i po mnogočemu superiornije cgi-lib.pl CGI.pm napisan za Perl 5 i koristi potpuno objektno orijentiranu shemu za rad s CGI podacima. Modul CGI.pm analizira standardni unos i varijablu QUERY_STRING te pohranjuje podatke u CGI objekt. Vaš program treba samo stvoriti novi CGI objekt i koristiti jednostavne metode kao što je paramQ za izdvajanje podataka koji su vam potrebni. Primjer 9-2 služi kao kratka demonstracija kako CGI.pm interpretira podatke. Koristit će se svi primjeri Perla u ovom poglavlju CGI.pm.
Primjer 9-2.
Parsiranje CGI podataka u Perlu
#!/usr/bin/perl -w
koristiti CGI qw(:standard);
# Koristi se CGI.pm modul. qw(:standard) uvozi
# imenski prostor standardnih CGI funkcija za dobivanje
# kod za čišćenje. To se može učiniti ako skripta
# koristi se samo jedan CGI objekt.
$mycgi = novi CGI; #Izradite CGI objekt koji će biti "pristupnik" za podatke obrasca
@polja = $mycgi->param; # Izdvojite nazive svih ispunjenih polja obrasca
zaglavlje ispisa, start_html("CGI.pm test"); ft metode "header" i "start_html",
# osigurano
# CGI.pm olakšava dobivanje HTML-a.
# "header" ispisuje potrebno HTTP zaglavlje, a
#"start_html" ispisuje HTML zaglavlje s danim imenom,
#a također označiti
.ispis"<р>Podaci obrasca:
";
foreach (@fields) (ispis $_, ":",- $mycgi->param($_), "
"; }
# Za svako polje prikažite naziv i vrijednost dobivenu pomoću
#
$mycgi->param("naziv polja").
ispis end_html; # Skraćenica za izlaz završnih oznaka "".
Obrada unosa u C
Budući da su glavni API-ji za MySQL i mSQL napisani na C, nećemo potpuno napustiti C u korist Perla, ali ćemo dati neke primjere C gdje je to prikladno. Postoje tri široko korištene C biblioteke za CGI programiranje: cgic Tom Boutell*; cgihtml Eugene Kim t i libcgi iz EIT-a*. Vjerujemo u to cgic je najpotpuniji i jednostavan za korištenje. Međutim, nedostaje mu mogućnost nabrajanja svih varijabli oblika kada vam nisu unaprijed poznate. Zapravo, može se dodati jednostavnim zakrpom, ali to je izvan dosega ovog poglavlja. Stoga u primjeru 9-3 koristimo biblioteku cgihtml, da ponovite gornju Perl skriptu u C.
Primjer 9-3.Raščlanjivanje CGI podataka u C
/*
cgihtmltest.c - Generički CGI program za ispis ključeva i njihovih vrijednosti
iz podataka dobivenih iz obrasca */
#uključiti
#include "cgi-lib.h" /* Ovo sadrži sve definicije CGI funkcija */
#include "html-lib.h" /* Ovo sadrži "sve definicije pomoćnih funkcija za HTML */
void print_all(lllist 1)
/* Ove funkcije izlaze obrascu poslane podatke u istom formatu kao i gornja Perl skripta. Cgihtml također nudi ugrađenu funkciju
Print_entries() koji čini isto koristeći format HTML liste. */ (
čvor*prozor;
/* Tip "čvor" definiran je u cgihtml biblioteci i odnosi se na povezani popis koji sadrži sve podatke obrasca. */
prozor = i.glava; /* Postavlja pokazivač na početak podataka obrasca */
dok (prozor != NULL) ( /* Prijelaz preko povezanog popisa do posljednjeg (prvog praznog) elementa */
printf(" %s:%s
\n",window->entry.name,replace_ltgt(window->entry.value));
/* Izlazni podaci. Replace__ltgt() je funkcija koja razumije HTML kodiranje teksta i osigurava da je ispravno prikazan u pregledniku klijenta. */
prozor = prozor->sljedeća; /* Prelazak na sljedeći element na popisu. */
} }
int main() (
popis unosa; /* Pokazivač na raščlanjene podatke*/
status int; /* Cijeli broj koji predstavlja status */
html_header(); /* HTML pomoćna funkcija koja daje HTML zaglavlje */
html_begin("cgihtml test");
/* HTML pomoćna funkcija koja daje početak HTML stranice s navedenim naslovom. */
status = read_cgi_input(&unosi); /* Izvodi unos i raščlanjivanje podataka obrasca */
printf("<р>Podaci obrasca:
");
print_sve(unosi); /* Poziva funkciju print_all() definiranu gore. */
html_end(); /* HTML pomoćna funkcija koja daje kraj HTML stranice. */
List_clear(&unosi); /* Oslobađa memoriju koju zauzimaju podaci obrasca. */
vrati 0; )
Standardni izlazni uređaj
Podatke koje CGI program šalje na standardni izlaz čita web poslužitelj i šalje klijentu. Ako naziv skripte počinje s nph-, podaci se šalju izravno klijentu bez intervencije web poslužitelja. U ovom slučaju, CGI program mora generirati važeće HTTP zaglavlje koje će klijent razumjeti. U suprotnom, neka web poslužitelj generira HTTP zaglavlje umjesto vas.
Čak i ako ne koristite nph-script, morate poslužitelju dati jednu direktivu koja će mu reći informacije o vašem izdavanju. Ovo je obično HTTP zaglavlje Content-Type, ali može biti i zaglavlje lokacije. Nakon naslova mora biti prazan redak, tj. novi redak ili kombinacija CR/LF.
Zaglavlje Content-Type govori poslužitelju koju vrstu podataka vaš CGI program poslužuje. Ako je ovo HTML stranica, niz bi trebao biti Content-Type: tekst/html. Zaglavlje Lokacija govori poslužitelju drugi URL - ili drugačiji put na istom poslužitelju - kamo usmjeriti klijenta. Naslov bi trebao izgledati ovako: Lokacija: http:// www. moj poslužitelj. com/drugo/mjesto/.
Nakon HTTP zaglavlja i praznog niza, možete poslati stvarne podatke koje vaš program proizvodi - HTML stranicu, sliku, tekst ili bilo što drugo. Među CGI programima koji dolaze s Apache poslužiteljem su nph-test-cgi i test cgi, koji dobro pokazuju razliku između nph i ne-nph naslova, redom.
U ovom ćemo odjeljku koristiti knjižnice CGI.pm i cgic, koji imaju funkcije za izlaz i HTTP i HTML zaglavlja. To će vam omogućiti da se usredotočite na izlaz stvarnog sadržaja. Ove pomoćne funkcije koriste se u primjerima ranije u ovom poglavlju.
Važne značajke CGI skripti
Već znate u osnovi kako CGI radi. Klijent šalje podatke, obično putem obrasca, na web poslužitelj. Poslužitelj izvršava CGI program, prosljeđujući mu podatke. CGI program obavlja svoju obradu i vraća svoj izlaz poslužitelju, koji ga šalje klijentu. Sada, od razumijevanja kako CGI-npor okviri rade, moramo prijeći na razumijevanje zašto se tako široko koriste.
Iako već znate dovoljno iz ovog poglavlja da sastavite jednostavan CGI program koji radi, potrebno je razmotriti još nekoliko važnih stvari prije nego što počnete pisati stvarno funkcionalne programe za MySQL ili mSQL. Prvo morate naučiti kako raditi s više oblika. Zatim morate naučiti neke sigurnosne mjere koje će spriječiti napadače da dobiju nezakonit pristup datotekama vašeg poslužitelja ili ih unište.
Državno pamćenje
Izvještavanje o stanju je vitalno sredstvo za pružanje dobre usluge vašim korisnicima, a ne samo za borbu protiv okorjelih kriminalaca, kako se čini. Problem je uzrokovan činjenicom da je HTTP takozvani "memoryless" protokol. To znači da klijent šalje podatke poslužitelju, poslužitelj vraća podatke klijentu, a onda svatko ide svojim putem. Poslužitelj ne pohranjuje podatke o klijentu koji bi mogli biti potrebni u narednim operacijama. Isto tako, nema jamstva da će klijent spremiti podatke o transakciji koji se mogu kasnije koristiti. To nameće trenutno i značajno ograničenje na korištenje World Wide Weba.
Skriptiranje CGI-a prema ovom protokolu analogno je nemogućnosti pamćenja razgovora. Kad god s nekim razgovarate, bez obzira koliko ste često razgovarali s njim prije, morate se predstaviti i pronaći zajedničku temu za razgovor. Nepotrebno je reći da to ne doprinosi produktivnosti. Slika 9-2 pokazuje da svaki put kada zahtjev stigne do CGI programa, to je potpuno nova instanca programa bez veze s prethodnom.
Na strani klijenta, s pojavom Netscape Navigatora, postojalo je rješenje koje se zvalo kolačići. Sastoji se od stvaranja novog HTTP zaglavlja koje se može slati naprijed-natrag između klijenta i poslužitelja, slično zaglavljima Content-Type i Location. Klijentski preglednik, po primitku zaglavlja kolačića, mora pohraniti podatke u kolačić, kao i naziv domene na kojoj kolačić djeluje. Nakon toga, kad god se posjeti URL unutar navedene domene, zaglavlje kolačića mora se vratiti poslužitelju za korištenje u CGI programima na tom poslužitelju.
Metoda kolačića uglavnom se koristi za pohranu korisničkog ID-a. Podaci o posjetiteljima mogu se pohraniti u datoteku na poslužiteljskom stroju. Jedinstveni ID ovog korisnika može se poslati kao kolačić u korisnikov preglednik, nakon čega, svaki put kada korisnik posjeti stranicu, preglednik automatski šalje ovaj ID poslužitelju. Poslužitelj prosljeđuje ID CGI programu, koji otvara odgovarajuću datoteku i dobiva pristup svim podacima o korisniku. Sve se to događa na način koji je korisniku nevidljiv.
Koliko god ova metoda bila korisna, većina velikih web stranica je ne koristi kao jedini način pamćenja stanja. Za to postoji niz razloga. Prvo, ne podržavaju svi preglednici kolačiće. Donedavno glavni preglednik za slabovidne (da ne spominjemo osobe s slabom brzinom mreže) - Lynx - nije podržavao kolačiće. Još uvijek ih "službeno" ne podržava, iako neke od njegovih široko dostupnih "bočnih grana" podržavaju. Drugo, i što je još važnije, kolačići povezuju korisnika s određenim strojem. Jedna od velikih vrlina Weba je da je dostupan s bilo kojeg mjesta na svijetu. Bez obzira na to gdje je vaša web stranica stvorena ili pohranjena, može se prikazati s bilo kojeg uređaja spojenog na internet. Međutim, ako pokušate pristupiti web-mjestu s omogućenim kolačićima s tuđeg računala, svi vaši osobni podaci koje je kolačić podržavao bit će izgubljeni.
Mnoga web-mjesta još uvijek koriste kolačiće za personalizaciju korisničkih stranica, ali većina ih nadopunjuje tradicionalnim sučeljem u stilu prijave/lozinke. Ako se stranici pristupa iz preglednika koji ne podržava kolačiće, tada stranica sadrži obrazac u kojem korisnik upisuje korisničko ime i lozinku koja mu je dodijeljena kada je prvi put posjetio stranicu. Obično je ovaj obrazac malen i skroman kako ne bi uplašio većinu korisnika koje ne zanima nikakva personalizacija, već jednostavno žele ići dalje. Kada korisnik unese korisničko ime i lozinku u obrazac, CGI pronalazi korisničku podatkovnu datoteku kao da je ime poslano s kolačićem. Koristeći ovu metodu, korisnik se može registrirati na personaliziranoj web stranici s bilo kojeg mjesta u svijetu.
Osim zadataka obračuna korisničkih preferencija i dugotrajnog pohranjivanja informacija o tome, može se dati suptilniji primjer pamćenja stanja, koji pružaju popularne tražilice. Kada pretražujete pomoću usluga kao što su AltaVista ili Yahoo, obično dobivate daleko više rezultata nego što možete prikazati u lako čitljivom formatu. Ovaj se problem rješava prikazivanjem malog broja rezultata - obično 10 ili 20 - i pružanjem nekih sredstava za navigaciju za prikaz sljedeće grupe rezultata. Iako se ovo ponašanje čini uobičajenim i očekivanim za prosječnog web surfera, stvarna implementacija nije trivijalna i zahtijeva pamćenje stanja.
Kada korisnik prvi put uputi zahtjev tražilici, ona prikuplja sve rezultate, možda podliježu nekom unaprijed definiranom ograničenju. Trik je dati ove rezultate u isto vrijeme u maloj količini, a pritom zapamtiti kakav je korisnik tražio ove rezultate i koji dio očekuje sljedeći. Ostavljajući po strani složenost same tražilice, suočeni smo s problemom dosljednog pružanja korisniku neke informacije na jednoj stranici. Razmotrite primjer 9-4, koji prikazuje CGI skriptu koja daje deset redaka datoteke i omogućuje joj da pogleda sljedećih ili prethodnih deset redaka.
Primjer 9-4. Spremanje stanja u CGI skriptu
#!/usr/bin/perl -w
koristiti CGI;
Open(F,"/usr/dict/words") ili die("Ne mogu otvoriti! $!");
#Ovo je datoteka koja će biti izlazna, može biti bilo što.
$output = novi CGI;
sub print_range ( # Ovo je glavna funkcija programa, moj $start = shift;
# Početni redak datoteke, moj $count = 0;
# Pokazivač, moj $line = "";
# Trenutni redak datoteke, ispis $output->header,
$output->start_html("Moj rječnik");
#
Generira HTML s naslovom "Moj rječnik", ispis "
dok (($broj< $start) and ($line =
# Preskoči sve retke prije početka, dok (($count< $start+10) and
($line ?
#
Ispišite sljedećih 10 redaka.
moj $newnext = $start+10; moj $newprev = $start-10;
# Postavite početne nizove za "Sljedeći" i "Prethodni" URL,
ispis"
";
osim ako ($start == 0) ( # Omogućite "Prethodni" URL osim ako vi
# više nije na početku.
ispis qq%Prethodni%; )
osim ako (eof) ( # Uključite "Sljedeći" URL osim ako #
ne na kraju datoteke.
ispis qq%Sljedeći%;
}
ispis "HTML;HTML
izlaz (0); )
# Ako nema podataka, počni ispočetka,
ako (ne $output->param) (
&raspon_ispisa(0); )
# Inače, počnite od niza navedenog u podacima.
&print_range($output->param("start"));
U ovom primjeru, pamćenje stanja se obavlja najjednostavnijom metodom. Nema problema sa spremanjem podataka, jer ih čuvamo u datoteci na serveru. Moramo samo znati odakle započeti izlaz, tako da skripta jednostavno uključuje početnu točku za sljedeću ili prethodnu grupu redaka u URL-u, što je sve što je potrebno za generiranje sljedeće stranice.
Međutim, ako vam je potrebno više od pukog pomicanja kroz "datoteku, oslanjanje na URL može biti glomazno. Ovu poteškoću možete ublažiti korištenjem HTML obrasca i uključivanjem podataka o stanju u oznake. SKRIVENI tip. Ovu tehniku s uspjehom koriste mnoga web-mjesta, omogućujući vam povezivanje između povezanih CGI programa ili proširenje upotrebe jednog CGI programa, kao u prethodnom primjeru. Umjesto upućivanja na određeni entitet, kao što je početna stranica, URL podaci mogu upućivati na automatski generirani korisnički ID.
Ovako rade AltaVista i druge tražilice. Prvo pretraživanje generira korisnički ID koji je implicitno uključen u sljedeće URL-ove. Ovaj ID je povezan s jednom ili više datoteka koje sadrže rezultate upita. U URL su uključene još dvije vrijednosti: trenutna pozicija u datoteci rezultata i smjer u kojem se želite dalje kretati u njoj. Ove tri vrijednosti su sve što je potrebno za pokretanje moćnih navigacijskih sustava velikih tražilica.
Međutim, nedostaje još nešto. Datoteka korištena u našem primjeru /usr/diet/words vrlo velika. Što ako ga ostavimo usred čitanja, ali mu se želimo vratiti kasnije? Ako se ne sjećate URL-a sljedeće stranice, nema načina da se vratite, čak vam ni AltaVista ne dopušta. Ako ponovno pokrenete računalo ili počnete raditi s drugog, nemoguće je vratiti se na prethodne rezultate pretraživanja bez ponovnog unosa upita. Međutim, ova dugoročna zadržavanje stanja u središtu je personalizacije web stranice o kojoj smo gore govorili i vrijedi vidjeti kako se to može iskoristiti. Primjer 9-5 je modificirana verzija primjera 9-4.
Primjer 9-5.
Trajna memorija stanja
#!/usr/bin/perl -w
koristiti CGI;
umask 0;
Open(F,"/usr/dict/words") ili die("Ne mogu otvoriti! $!");
Chdir("users") ili die("Ne mogu se promijeniti u direktorij $!");
#
Ovo je direktorij u koji će se pohranjivati svi podaci
# o korisniku.
Izlaz = novi CGI;
ako (ne $output->param) (
ispis $output->header,
$output->start_html("Moj rječnik");
ispis "HTML;