Kapitola 9.
Programovanie pomocou CGI
Zahrnutie časti o CGI do databázovej knihy sa môže zdať rovnako zvláštne ako mať v kuchárskej knihe kapitolu o oprave áut. Samozrejme, aby ste mohli ísť do obchodu s potravinami, potrebujete prevádzkyschopné auto, ale je vhodné o tom hovoriť? Úplný úvod do CGI a webového programovania vo všeobecnosti presahuje rámec tejto knihy, ale krátky úvod do týchto tém postačuje na rozšírenie schopnosti MySQL a mSQL reprezentovať údaje vo sfére webu.
Táto kapitola je určená hlavne pre tých, ktorí sa učia o databázach, ale chceli by získať aj nejaké znalosti o webovom programovaní. Ak je vaše priezvisko Berners-Lee alebo Andressen, je nepravdepodobné, že tu nájdete niečo, čo by ste ešte nevedeli. Ale aj keď nie ste v CGI nováčikom, mať po ruke rýchlu referenciu pri ponorení sa do tajomstiev MySQL a mSQL môže byť celkom užitočné.
Čo je CGI?
Ako väčšina skratiek, Common Gateway Interface (CGI znamená Common Gateway Interface) toho veľa nehovorí. Rozhranie s čím? Kde je táto brána? O akej komunite hovoríme? Pre zodpovedanie týchto otázok sa vráťme trochu späť a pozrime sa na WWW ako celok.
Tim Berners-Lee, fyzik, ktorý pracoval v CERN-e, prišiel s webom v roku 1990, hoci plán sa datuje do roku 1988. Cieľom bolo umožniť výskumníkom časticovej fyziky jednoducho a rýchlo si vymieňať multimediálne údaje – text, obrázky a zvuk. - cez internet. WWW pozostával z troch hlavných častí: HTML, URL a HTTP. HTML- formátovací jazyk používaný na reprezentáciu obsahu na webe. url- toto je adresa používaná na získanie obsahu vo formáte HTML (alebo inom) z webového servera. A nakoniec http- je to jazyk, ktorému webový server rozumie a umožňuje klientom vyžiadať si dokumenty zo servera.
Možnosť posielať všetky druhy informácií cez internet bola revolúciou, no čoskoro sa objavila ďalšia možnosť. Ak môžete poslať akýkoľvek text cez web, prečo potom nemôžete odoslať text vytvorený programom a nie prevzatý z hotového súboru? To otvára more možností. Jednoduchým príkladom je použitie programu, ktorý vytlačí aktuálny čas, aby čitateľ pri každom zobrazení stránky videl správny čas. Niekoľko šikovných hláv v Národnom centre pre superpočítačové aplikácie (NCSA), ktorí stavali webový server, videlo túto príležitosť a čoskoro sa zrodilo CGI.
CGI je súbor pravidiel, podľa ktorých môžu programy na serveri odosielať údaje klientom cez webový server. Špecifikáciu CGI sprevádzali zmeny v HTML a HTTP, ktoré zaviedli novú funkciu známu ako formuláre.
Zatiaľ čo CGI umožňuje programom posielať dáta klientovi, formuláre rozširujú túto schopnosť tým, že umožňujú klientovi posielať dáta do tohto CGI programu. Teraz môže používateľ nielen vidieť aktuálny čas, ale aj nastaviť hodiny! Formuláre CGI otvorili dvere skutočnej interaktivite vo svete webu. Bežné aplikácie CGI zahŕňajú:
- Dynamický HTML. Celé stránky môžu byť generované jediným CGI programom.
- Vyhľadávače, ktoré hľadajú dokumenty s používateľsky zadanými slovami.
- Knihy návštev a nástenky, kde môžu používatelia pridávať svoje správy.
- Objednávkové formuláre.
- Dotazníky.
- Extrahovanie informácií z databázy hosťovanej na serveri.
V nasledujúcich kapitolách rozoberieme všetky tieto aplikácie CGI, ako aj niekoľko ďalších. Všetky poskytujú vynikajúcu príležitosť na pripojenie CGI k databáze, čo nás v tejto časti zaujíma.
HTML formuláre
Pred skúmaním špecifík CGI je užitočné pozrieť sa na najbežnejší spôsob, akým koncoví používatelia získavajú rozhranie k programom CGI: formuláre HTML. Formuláre sú súčasťou jazyka HTML, ktorý poskytuje koncovému používateľovi rôzne typy polí. Údaje zadané do polí možno odoslať na webový server. Polia môžu byť použité na zadávanie textu alebo môžu byť tlačidlami, na ktoré môže používateľ kliknúť alebo zaškrtnúť. Tu je príklad stránky HTML obsahujúcej formulár:
<НТМL><НЕАD><ТITLЕ>Moja stránka s formulárom
<р>Toto je stránka formulára.
Tento formulár vytvorí 40-miestny reťazec, do ktorého môže používateľ zadať svoje meno. Pod vstupným riadkom sa nachádza tlačidlo, po stlačení sa údaje formulára prenesú na server. Nasledujú značky súvisiace s formulármi podporované HTML 3.2, dnes najpoužívanejším štandardom. Názvy značiek a atribútov je možné zadať v každom prípade, ale dodržiavame voliteľnú konvenciu, že úvodné značky sa píšu veľkými písmenami a záverečné značky sa píšu malými písmenami.
Jediný typ vstupu, ktorý sme tu nepoužili, je typ IMAGE pre značku . Dalo by sa použiť ako alternatívny spôsob odoslania formulára. Typ IMAGE je však málokedy kompatibilný s textovými a málo citlivými prehliadačmi, preto je rozumné sa mu vyhnúť, pokiaľ váš web nemá bohatý grafický štýl.
Teraz, keď ste oboznámení so základmi HTML formulárov, ste pripravení preskúmať samotné CGI.
Špecifikácia CGI
Takže čo presne je "súbor pravidiel", ktorý umožňuje programu CGI v, povedzme, Batavia, Illinois, komunikovať s webovým prehliadačom vo Vonkajšom Mongolsku? Oficiálnu špecifikáciu CGI spolu s množstvom ďalších informácií o CGI možno nájsť na serveri NCSA na adrese http://hoohoo . ncsa.uluc.edu/cgi/. Táto kapitola však existuje preto, aby ste nemuseli dlho cestovať a hľadať ju sami.
Existujú štyri spôsoby, ako CGI odovzdáva údaje medzi rámcom CGI-npor a webovým serverom, a teda webovým klientom:
- premenné prostredia.
- Príkazový riadok.
- Štandardné vstupné zariadenie.
- štandardné výstupné zariadenie.
Pomocou týchto štyroch metód server odošle všetky údaje odoslané klientom do programu CGI. Program CGI potom vykoná svoje čaro a pošle výstup späť na server, ktorý ho prepošle klientovi.
Tieto údaje sú založené na serveri Apache HTTP. Apache je najpoužívanejší webový server a beží na takmer akejkoľvek platforme, vrátane Windows 9x a Windows NT. Môžu sa však použiť na všetky servery HTTP, ktoré podporujú CGI. Niektoré proprietárne servery, ako napríklad servery od spoločností Microsoft a Netscape, môžu mať ďalšie funkcie alebo môžu fungovať odlišne. Keďže sa tvár webu neustále mení neuveriteľnou rýchlosťou, štandardy sa stále vyvíjajú a budúcnosť sa určite zmení. Čo sa však týka CGI, zdá sa, že táto technológia je dobre zavedená – cena za to je tá, že ju nahradili iné technológie, ako napríklad applety. Akékoľvek CGI programy, ktoré napíšete pomocou týchto informácií, budú takmer určite schopné bežať na väčšine webových serverov ešte mnoho rokov.
Keď je program CGI vyvolaný prostredníctvom formulára, najbežnejšieho rozhrania, prehliadač odošle serveru dlhý reťazec, ktorý začína cestou k programu CGI a jeho názvom. Potom nasledujú rôzne ďalšie údaje, nazývané informácie o ceste, ktoré sú odovzdané programu CGI cez premennú prostredia PATH_INFO (obrázok 9-1). Za informáciou o ceste nasleduje znak „?“, za ktorým nasledujú údaje formulára, ktoré sa odosielajú na server pomocou metódy HTTP GET. Tieto údaje sú sprístupnené programu CGI prostredníctvom premennej prostredia QUERY_STRING. Všetky údaje, ktoré stránka odošle pomocou metódy HTTP POST, ktorá je najčastejšie používaná, budú odovzdané programu CGI cez štandardný vstup. Typický reťazec, ktorý môže server prijať z prehliadača, je znázornený na obrázku 1. 9-1. pomenovaný program formread v katalógu cgi-bin volaný serverom s dodatočnými informáciami o ceste extra informácia a choice=help request data – pravdepodobne ako súčasť pôvodnej adresy URL. Nakoniec sa samotné údaje formulára (text „CGI programovanie“ v poli „kľúčové slová“) odošlú prostredníctvom metódy HTTP POST.
Premenné prostredia
Keď server vykonáva program CGI, najprv mu odovzdá nejaké údaje, aby sa spustil vo forme premenných prostredia. V špecifikácii je oficiálne definovaných sedemnásť premenných, ale mnohé ďalšie sa neoficiálne používajú prostredníctvom nižšie opísaného mechanizmu s názvom HTTP_/nec/zams/n. CGI program
má prístup k týmto premenným rovnako ako všetky premenné prostredia shellu pri spustení z príkazového riadku. Napríklad v shell skripte je možné pristupovať k premennej prostredia F00 ako $F00; v Perle toto volanie vyzerá ako $ENV("F00") ; v C - getenv("F00") ; Tabuľka 9-1 uvádza premenné, ktoré vždy nastavuje server, aj keď sú nulové. Okrem týchto premenných sú dáta vrátené klientom v hlavičke požiadavky priradené premenným v tvare HTTP_F00 , kde F00 je názov hlavičky. Napríklad väčšina webových prehliadačov obsahuje informácie o verzii v hlavičke s názvom USEfl_AGENT . Váš rámec CGI npor môže získať tieto informácie z premennej HTTP_USER_AGENT.
Tabuľka 9-1.premenné prostredia CGI
premenná prostredia |
Popis |
||
CONTENT_LENGTH |
Dĺžka údajov odovzdaných metódami POST alebo PUT v bajtoch. |
||
DRUH OBSAHU |
Typ MIME údajov pripojených pomocou metód POST alebo PUT. |
||
GATEWAY_INTERFACE |
Číslo verzie špecifikácie CGI podporovanej serverom. |
||
PATH_INFO |
Ďalšie informácie o ceste poskytnuté klientom. Napríklad na žiadosť http://www.myserver.eom/test.cgi/this/is/a/ cesta?pole=zelena hodnota premennej PATH_INFO bude /toto/je/a/cesta. |
||
PATH_TRANSLATED |
Rovnaké ako PATH_INFO , ale server vytvára všetko |
||
|
Možný preklad, napríklad, rozšírenie názvu ako "-account". » |
||
QUERY_STRING |
Všetky údaje po „?“ v adrese URL. Toto sú tiež údaje odovzdané, keď má REQ-UEST_METHOD formulára hodnotu GET. |
||
REMOTE_ADDR |
IP adresa klienta, ktorý žiada. |
||
VZDIALENÝ HOSTITEĽ |
Názov hostiteľa klientskeho počítača, ak je dostupný. |
||
REMOTE_IDENT |
Ak webový server a klient podporujú identifikáciu typu identd, potom je to používateľské meno účtu, ktorý podáva požiadavku. |
||
REQUEST_METHOD |
Metóda, ktorú klient použil na vytvorenie požiadavky. Pre programy CGI, ktoré sa chystáme vytvoriť, to bude zvyčajne POST alebo GET. |
||
NÁZOV SERVERA | Názov hostiteľa – alebo IP adresa, ak názov nie je dostupný – počítača, na ktorom beží webový server. | ||
PORT SERVERA | Číslo portu používané webovým serverom. | ||
SERVER_PROTOCOL |
Protokol, ktorý klient používa na komunikáciu so serverom. V našom prípade je tento protokol takmer vždy HTTP. | ||
SERVER_SOFTWARE | Informácie o verzii webového servera, na ktorom je spustený program CGI. | ||
SCRIPT_NAME |
Cesta ku skriptu, ktorý sa má vykonať, podľa špecifikácie klienta. Dá sa použiť, keď adresa URL odkazuje sama na seba, takže skripty, na ktoré sa odkazuje na rôznych miestach, sa môžu spúšťať odlišne v závislosti od miesta. |
||
Tu je príklad skriptu Perl CGI, ktorý vytlačí všetky premenné prostredia nastavené serverom, ako aj všetky staršie premenné, ako napríklad PATH, nastavené shellom, ktorý spustil server.
#!/usr/bin/perl -w
vytlačiť<< HTML;
Typ obsahu: text/html\n\n
HTML
foreach (klávesy %ENV) (tlač "$_: $ENV($_)
\n" ;)
vytlačiť<
HTML
Všetky tieto premenné môžu byť použité a dokonca modifikované vaším CGI programom. Tieto zmeny však neovplyvnia webový server, ktorý spustil program.
Príkazový riadok
CGI umožňuje odovzdať argumenty programu CGI ako voľby príkazového riadku, čo sa používa len zriedka. Používa sa zriedka, pretože jeho praktické využitie je málo a nebudeme sa ním podrobne zaoberať. Pointa je, že ak premenná prostredia QUERY_STRING neobsahuje znak " = ", potom sa program CGI spustí s parametrami príkazového riadku prevzatými z QUERY_STRING . Napríklad, http://www.myserver.com/cgi- bin/finger?root spustí koreň prsta na www.myserver.com.
Existujú dve hlavné knižnice, ktoré poskytujú rozhranie CGI pre Perl. Prvý z nich - cgi-lib.pl Utility cgi-lib.pl veľmi bežné, pretože to bola dlho jediná veľká dostupná knižnica. Je navrhnutá tak, aby fungovala v Perle 4, ale funguje aj v Perle 5. Druhá knižnica, CGI.pm, novšie a v mnohých smeroch lepšie cgi-lib.pl CGI.pm napísaný pre Perl 5 a používa plne objektovo orientovanú schému na prácu s údajmi CGI. modul CGI.pm analyzuje štandardný vstup a premennú QUERY_STRING a uloží údaje do objektu CGI. Váš program potrebuje iba vytvoriť nový objekt CGI a použiť jednoduché metódy ako paramQ na extrahovanie údajov, ktoré potrebujete. Príklad 9-2 slúži ako krátka ukážka ako CGI.pm interpretuje údaje. Všetky príklady Perl v tejto kapitole budú použité CGI.pm.
Príklad 9-2.
Analýza údajov CGI v jazyku Perl
#!/usr/bin/perl -w
použite CGI qw(:štandard);
# Používa sa modul CGI.pm. qw(:štandardné) importy
# namespace štandardných funkcií CGI, ktoré sa majú získať
# kód čističa. To možno vykonať, ak skript
# je použitý len jeden CGI objekt.
$mycgi = nové CGI; #Vytvorte objekt CGI, ktorý bude „bránou“ k údajom formulára
@fields = $mycgi->param; # Extrahujte názvy všetkých vyplnených polí formulára
vytlačiť hlavičku, start_html("CGI.pm test"); ft metódy "header" a "start_html",
# poskytnuté
# CGI.pm uľahčuje získanie kódu HTML.
# "header" vypíše požadovanú HTTP hlavičku, a
#"start_html" vypíše hlavičku HTML s daným názvom,
#a tiež značka
.tlačiť"<р>Údaje formulára:
";
foreach (@fields) ( print $_, ":",- $mycgi->param($_), "
"; }
# Pre každé pole zobrazte názov a hodnotu získanú pomocou
#
$mycgi->param("názov poľa").
print end_html; # Skratka pre výstup koncových značiek "".
Spracovanie vstupu v C
Keďže hlavné API pre MySQL a mSQL sú napísané v C, úplne neopustíme C v prospech Perlu, ale tam, kde je to vhodné, uvedieme niekoľko príkladov C. Na programovanie CGI existujú tri široko používané knižnice C: cgic Tom Boutell*; cgihtml Eugene Kim t a libcgi od EIT*. Tomu veríme cgic je najkompletnejší a ľahko použiteľný. Chýba mu však možnosť vymenovať všetky premenné formulára, keď vám nie sú vopred známe. V skutočnosti sa dá pridať pomocou jednoduchého patchu, ale to je nad rámec tejto kapitoly. Preto v príklade 9-3 použijeme knižnicu cgihtml, zopakujte vyššie uvedený skript v jazyku C.
Príklad 9-3.Analýza údajov CGI v C
/*
cgihtmltest.c - Všeobecný CGI program na tlač kľúčov a ich hodnôt
z údajov prijatých z formulára */
#include
#include "cgi-lib.h" /* Toto obsahuje všetky definície funkcií CGI */
#include "html-lib.h" /* Toto obsahuje "všetky definície pomocných funkcií pre HTML */
void print_all(lllist 1)
/* Tieto funkcie vypisujú údaje odoslané z formulára v rovnakom formáte ako vyššie uvedený skript v jazyku Perl. Cgihtml tiež poskytuje vstavanú funkciu
Print_entries(), ktorá robí to isté s použitím formátu zoznamu HTML. */ (
uzol*okno;
/* Typ "uzol" je definovaný v knižnici cgihtml a odkazuje na prepojený zoznam, ktorý obsahuje všetky údaje formulára. */
okno = i.hlava; /* Nastaví ukazovateľ na začiatok údajov formulára */
while (okno != NULL) ( /* Prejdite prepojeným zoznamom k poslednému (prvému prázdnemu) prvku */
printf(" %s:%s
\n",okno->zaznam.nazov,nahradit_ltgt(okno->zaznam.hodnota));
/* Výstupné dáta. Replace__ltgt() je funkcia, ktorá rozumie kódovaniu HTML textu a zaisťuje jeho správne zobrazenie v klientskom prehliadači. */
okno = okno->dalsi; /* Presun na ďalší prvok v zozname. */
} }
int main() (
zoznam položiek; /* Ukazovateľ na analyzované údaje*/
stav int; /* Celé číslo predstavujúce stav */
html_header(); /* Pomocná funkcia HTML, ktorá vypíše hlavičku HTML */
html_begin("cgihtml test");
/* Pomocná funkcia HTML, ktorá vypíše začiatok stránky HTML so zadaným nadpisom. */
status = read_cgi_input(&záznamy); /* Vykonáva vstup a analýzu údajov formulára */
printf("<р>Údaje formulára:
");
print_all(entries); /* Volá funkciu print_all() definovanú vyššie. */
html_end(); /* Pomocná funkcia HTML, ktorá vypíše koniec stránky HTML. */
List_clear(&entries); /* Uvoľní pamäť obsadenú údajmi formulára. */
návrat 0; )
Štandardné výstupné zariadenie
Dáta odoslané programom CGI na štandardný výstup sú načítané webovým serverom a odoslané klientovi. Ak názov skriptu začína na nph-,údaje sú odosielané priamo klientovi bez zásahu webového servera. V tomto prípade musí program CGI vygenerovať platnú hlavičku HTTP, ktorej bude klient rozumieť. V opačnom prípade nechajte webový server vygenerovať hlavičku HTTP za vás.
Aj keď nepoužívate nph-script, musíte dať serveru jednu direktívu, ktorá mu povie informácie o vašom vydaní. Zvyčajne ide o hlavičku HTTP Content-Type, ale môže to byť aj hlavička Location. Za nadpisom musí nasledovať prázdny riadok, t. j. nový riadok alebo kombinácia CR/LF.
Hlavička Content-Type informuje server, aký typ údajov poskytuje váš program CGI. Ak ide o stránku HTML, reťazec by mal byť Content-Type: text/html. Hlavička Location informuje server o inej adrese URL – alebo inej ceste na tom istom serveri – kam má nasmerovať klienta. Názov by mal vyzerať takto: Miesto: http:// www. môj server. com/other/place/.
Po hlavičkách HTTP a prázdnom reťazci môžete odoslať skutočné údaje, ktoré váš program vytvorí - HTML stránku, obrázok, text alebo čokoľvek iné. Medzi programami CGI, ktoré sa dodávajú so serverom Apache, sú nph-test-cgi a test cgi, ktoré dobre demonštrujú rozdiel medzi nadpismi nph a non-nph.
V tejto časti budeme používať knižnice CGI.pm a cgic, ktoré majú funkcie na výstup hlavičiek HTTP aj HTML. To vám umožní sústrediť sa na výstup skutočného obsahu. Tieto pomocné funkcie sú použité v príkladoch skôr v tejto kapitole.
Dôležité vlastnosti CGI skriptov
V podstate už viete, ako CGI funguje. Klient odosiela dáta, zvyčajne prostredníctvom formulára, na webový server. Server spustí program CGI a odovzdá mu údaje. Program CGI vykoná svoje spracovanie a vráti svoj výstup na server, ktorý ho odošle klientovi. Teraz, od pochopenia toho, ako fungujú rámce CGI-npor, musíme prejsť k pochopeniu, prečo sú tak široko používané.
Hoci z tejto kapitoly už viete dosť na to, aby ste dali dohromady jednoduchý fungujúci CGI program, je tu niekoľko dôležitejších vecí, ktoré je potrebné zvážiť predtým, ako budete môcť napísať skutočne fungujúce programy pre MySQL alebo mSQL. Najprv sa musíte naučiť pracovať s viacerými formulármi. Potom sa musíte naučiť niektoré bezpečnostné opatrenia, ktoré zabránia útočníkom získať nelegálny prístup k súborom vášho servera alebo ich zničiť.
Stavová pamäť
Stavovosť je životne dôležitým prostriedkom poskytovania dobrých služieb vašim používateľom, a to nielen v boji proti tvrdým zločincom, ako by sa mohlo zdať. Problém je spôsobený tým, že HTTP je takzvaný „bezpamäťový“ protokol. To znamená, že klient odošle dáta na server, server vráti dáta klientovi a potom si každý ide svojou cestou. Server neukladá údaje o klientovi, ktoré môžu byť potrebné v nasledujúcich operáciách. Rovnako nie je zaručené, že si klient uloží akékoľvek údaje o transakcii, ktoré môže neskôr použiť. To znamená okamžité a významné obmedzenie používania World Wide Web.
Skriptovanie CGI podľa tohto protokolu je analogické tomu, že si nemôžete zapamätať konverzáciu. Vždy, keď sa s niekým rozprávate, bez ohľadu na to, ako často ste sa s ním predtým rozprávali, musíte sa predstaviť a nájsť spoločnú tému, o ktorej sa budete rozprávať. Netreba dodávať, že to neprospieva produktivite. Obrázok 9-2 ukazuje, že zakaždým, keď požiadavka dosiahne program CGI, je to úplne nová inštancia programu bez spojenia s predchádzajúcim.
Na strane klienta sa s príchodom Netscape Navigatoru objavilo ošúchané riešenie s názvom cookies. Pozostáva z vytvorenia novej hlavičky HTTP, ktorú možno posielať tam a späť medzi klientom a serverom, podobne ako hlavičky Content-Type a Location. Klientsky prehliadač musí po prijatí hlavičky cookie uložiť údaje do cookie, ako aj názov domény, v ktorej cookie funguje. Potom, kedykoľvek sa navštívi URL v rámci špecifikovanej domény, hlavička cookie sa musí vrátiť na server na použitie v programoch CGI na tomto serveri.
Metóda cookie sa používa hlavne na uloženie ID používateľa. Informácie o návštevníkoch môžu byť uložené v súbore na serveri. Jedinečné ID tohto používateľa môže byť odoslané ako súbor cookie do prehliadača používateľa, po ktorom zakaždým, keď používateľ navštívi stránku, prehliadač automaticky odošle toto ID na server. Server odovzdá ID programu CGI, ktorý otvorí príslušný súbor a získa prístup ku všetkým údajom o používateľovi. To všetko sa deje spôsobom, ktorý je pre používateľa neviditeľný.
Akokoľvek je táto metóda užitočná, väčšina veľkých stránok ju nepoužíva ako jediný prostriedok na zapamätanie stavu. Existuje na to viacero dôvodov. Po prvé, nie všetky prehliadače podporujú súbory cookie. Donedávna hlavný prehliadač pre zrakovo postihnutých (nehovoriac o ľuďoch so slabou rýchlosťou siete) – Lynx – nepodporoval súbory cookie. Stále ich „oficiálne“ nepodporuje, hoci niektoré z jej široko dostupných „bočných pobočiek“ áno. Po druhé, a čo je dôležitejšie, súbory cookie spájajú používateľa s konkrétnym počítačom. Jednou z veľkých predností webu je, že je prístupný odkiaľkoľvek na svete. Bez ohľadu na to, kde bola vaša webová stránka vytvorená alebo uložená, môže byť zobrazená z akéhokoľvek zariadenia pripojeného k internetu. Ak sa však pokúsite o prístup na stránku s povolenými súbormi cookie zo zariadenia niekoho iného, všetky vaše osobné údaje, ktoré súbor cookie podporoval, sa stratia.
Mnoho stránok stále používa súbory cookie na prispôsobenie používateľských stránok, ale väčšina z nich ich dopĺňa tradičným rozhraním v štýle prihlasovania/hesla. Ak sa na stránku pristupuje z prehliadača, ktorý nepodporuje cookies, tak stránka obsahuje formulár, do ktorého používateľ zadá prihlasovacie meno a heslo, ktoré mu bolo pridelené pri prvej návšteve stránky. Zvyčajne je táto forma malá a skromná, aby neodstrašila väčšinu používateľov, ktorí nemajú záujem o žiadnu personalizáciu, ale chcú ísť jednoducho ďalej. Keď užívateľ zadá prihlasovacie meno a heslo do formulára, CGI nájde užívateľský dátový súbor, ako keby meno bolo odoslané s cookie. Pomocou tejto metódy sa používateľ môže zaregistrovať na personalizovanej webovej stránke odkiaľkoľvek na svete.
Okrem úloh účtovania preferencií používateľa a dlhodobého uchovávania informácií o ňom možno uviesť jemnejší príklad zapamätania stavu, ktorý poskytujú populárne vyhľadávače. Keď vyhľadávate pomocou služieb, ako je AltaVista alebo Yahoo, zvyčajne získate oveľa viac výsledkov, než môžete zobraziť v ľahko čitateľnom formáte. Tento problém je vyriešený zobrazením malého počtu výsledkov – zvyčajne 10 alebo 20 – a poskytnutím určitých prostriedkov navigácie na zobrazenie ďalšej skupiny výsledkov. Aj keď sa toto správanie zdá bežné a očakávané pre priemerného používateľa webu, skutočná implementácia nie je triviálna a vyžaduje si zapamätanie stavu.
Keď používateľ prvýkrát zadá požiadavku na vyhľadávací nástroj, zhromaždí všetky výsledky, ktoré môžu podliehať určitému vopred definovanému limitu. Trik je poskytnúť tieto výsledky súčasne v malom množstve, pričom si zapamätáte, aký druh používateľa tieto výsledky požadoval a akú časť očakáva ďalej. Ak odhliadneme od zložitosti samotného vyhľadávača, stojíme pred problémom dôsledne poskytnúť používateľovi nejaké informácie na jednej stránke. Zoberme si príklad 9-4, ktorý ukazuje CGI skript, ktorý vydáva desať riadkov súboru a umožňuje mu pozrieť sa na nasledujúcich alebo predchádzajúcich desať riadkov.
Príklad 9-4. Ukladanie stavu v CGI skripte
#!/usr/bin/perl -w
používať CGI;
Open(F,"/usr/dict/words") or die("Nedá sa otvoriť! $!");
#Toto je súbor, ktorý bude výstupom, môže to byť čokoľvek.
$výstup = nové CGI;
sub print_range ( # Toto je hlavná funkcia programu, my $start = shift;
# Začiatočný riadok súboru, môj $count = 0;
# Ukazovateľ, môj $riadok = "";
# Aktuálny riadok súboru, vytlačte $output->header,
$output->start_html("Môj slovník");
#
Vygeneruje HTML s názvom „Môj slovník“, vytlačí „
zatiaľ čo (($count< $start) and ($line =
# Preskočte všetky riadky pred začiatkom, zatiaľ čo (($count< $start+10) and
($line ?
#
Vytlačte ďalších 10 riadkov.
moje $nové ďalšie = $začiatok+10; moje $newprev = $start-10;
# Nastavte počiatočné reťazce pre adresy URL „Nasledujúca“ a „Predchádzajúca“,
tlačiť"
";
If ($start == 0) ( # Enable "Previous" URL, if you
# už nie je na začiatku.
print qq%Previous%; )
If (eof) ( # Zahrňte „Ďalšiu“ adresu URL, pokiaľ #
nie na konci súboru.
tlačiť qq%Next%;
}
vytlačiť "HTML;HTML
exit(0); )
# Ak neexistujú žiadne údaje, začnite odznova,
if (nie $output->param) (
&print_range(0); )
# V opačnom prípade začnite od reťazca uvedeného v údajoch.
&print_range($output->param("start"));
V tomto príklade sa zapamätanie stavu vykonáva pomocou najjednoduchšej metódy. S ukladaním dát nie je problém, keďže ich uchovávame v súbore na serveri. Potrebujeme len vedieť, odkiaľ začať výstup, takže skript jednoducho obsahuje počiatočný bod pre ďalšiu alebo predchádzajúcu skupinu riadkov v adrese URL, čo je všetko, čo je potrebné na vygenerovanie ďalšej stránky.
Ak však potrebujete viac než len prechádzať súborom, spoliehanie sa na adresu URL môže byť ťažkopádne. Tento problém môžete zmierniť použitím formulára HTML a zahrnutím údajov o stave do značiek. SKRYTÝ typ. Túto metódu s úspechom použili mnohé stránky, čo vám umožňuje prepojiť súvisiace programy CGI alebo rozšíriť používanie jedného programu CGI, ako v predchádzajúcom príklade. Namiesto odkazovania na konkrétnu entitu, ako je napríklad domovská stránka, môžu údaje adresy URL odkazovať na automaticky vygenerované ID používateľa.
Takto funguje AltaVista a iné vyhľadávače. Prvé vyhľadávanie vygeneruje ID používateľa, ktoré je implicitne zahrnuté v nasledujúcich adresách URL. Toto ID je spojené s jedným alebo viacerými súbormi obsahujúcimi výsledky dotazu. V URL sú zahrnuté ďalšie dve hodnoty: aktuálna pozícia vo výslednom súbore a smer, ktorým sa v ňom chcete posunúť ďalej. Tieto tri hodnoty sú všetko, čo je potrebné na spustenie výkonných navigačných systémov veľkých vyhľadávačov.
Chýba však niečo iné. Súbor použitý v našom príklade /usr/diéta/slova veľmi veľký. Čo ak ju necháme uprostred čítania, ale chceme sa k nej vrátiť neskôr? Ak si nepamätáte URL nasledujúcej stránky, nie je možné sa vrátiť späť, ani AltaVista vám to nedovolí. Ak reštartujete počítač alebo začnete pracovať z iného, nie je možné vrátiť sa k predchádzajúcim výsledkom vyhľadávania bez opätovného zadania dopytu. Táto dlhodobá stavovosť je však jadrom personalizácie webovej stránky, o ktorej sme hovorili vyššie, a oplatí sa vidieť, ako ju možno využiť. Príklad 9-5 je modifikovaná verzia príkladu 9-4.
Príklad 9-5.
Trvalá stavová pamäť
#!/usr/bin/perl -w
používať CGI;
umask 0;
Open(F,"/usr/dict/words") or die("Nedá sa otvoriť! $!");
Chdir("users") or die("Nemôžem prejsť do adresára $!");
#
Toto je adresár, kde budú uložené všetky údaje
# o používateľovi.
Výstup = nové CGI;
if (nie $output->param) (
vytlačiť $output->header,
$output->start_html("Môj slovník");
vytlačiť "HTML;