Perl kalbos pamokėlės

CGI.pm biblioteka: sausainiai

Pastaba: šiame tekste naudojame objektiškai orientuotas programavimo būdą (kitas – funkcinis). Todėl pradžioje turime sukurti CGI objektą, pvz.,

use CGI;
$cgi = new CGI;

HTTP protokolas pačia prigimtimi neišsaugo būsenų, todėl reikia mechanizmą išsaugoti tarp transakcijų. Tai galima padaryti keliais būdais, tačiau plačiausiai naudojamas ir aiškiausias yra "sausainiukų" (cookies) panaudojimas. Iš principo, "sausainis" yra vardo ir reikšmės pora, kuri saugoma tekstinėje byloje naršytojo kompiuteryje. Šie "sausainiai" perduodami tarnybiniai stočiai HTTP antraštėje.

CGI.pm pateikia paprastą funkcijų rinkinį "sausainių" priskyrimui ir nuskaitymui. Pateiksime paprasčiausią "sausainio" įrašymo pavyzdį:

$sausainis = $cgi->cookie(
      -name=>'pastaba',
       -value=>'Nauja pastaba.');
print $cgi-header(-cookie=>$sausainis);

Bus sukurta tokia eilutė, parodanti bendrąjį HTTP "sausainio" formatą:

pastaba=Nauja%20pastaba.; path=/

Nesudėtinga paimti ir "sausainio" reikšmę:

$pastabos_tekstas = $cgi->cookie('pastaba');

Jei iškviesime "cookie" metodą, nenurodę jokių parametrų, jis gražins visų skriptui perduotų "sausainių" sąrašą, pvz.,

@sausainiai = $cgi->cookie();

Yra keletas naudingų atributų, kuriuos galima priskirti "sausainiams". "domain" atributas leidžia priskirti svetainių domenus, su kuriomis bus naudojamas "sausainis". Įprasta "atmesti" subdomenus ir nurodyti tik aukščiausią lygį. Jei atributas nenurodomas, tai "sausainis" bus veiksnus tik tai tarnybinei stočiai, kurioje buvo sukurtas. Pavyzdys:

$sausainis = $cgi->cookie(-domain=>'.lithuanian.net',
       -name=>'pastaba',-value=>'Nauja pastaba.');

Kaip matome, "cookie" metodui parametrai perduodami pagal vardą, jų požymiu yra minusas ('-') prieš vardą ir jų eilės tvarka nesvarbi.

"path" atributas leidžia apriboti katalogus nurodant, kuriose jų šakose galima apdoroti "sausainius". Nenurodžius katalogo, "sausainį" gali naudoti visi skriptai. Pavyzdys:

$sausainis = $cgi->cookie(-path=>'/cgi-bin/tools',
       -name=>'pastaba',-value=>'Nauja pastaba.');

Šiuo kreipiniu nurodoma, kad sukurtas sausainis bus apdorojamas tik tų skriptų, kurie yra /cgi-bin/tools ir gilesnio lygio kataloguose.

"secure" atributas leidžia nurodyti, kad "sausainis" bus naudojamas tik saugiu sujungimu (pvz., SSL), pvz.,

$sausainis = $cgi->cookie(-secure=>1,
       -name=>'pastaba',-value=>'Nauja pastaba.');

"httponly" atributas leidžia nurodyti, kad "sausainis" gali būti pasiekiamas tik per HTTP užklausas. Jis tampa neprieinamas naudojant "JavaScript" ir taip apsisaugoma nuo XSS atakų. Vienok, šią galimybę užtikrina tik MS IE 6 SP 1 ir vėlesnės šios naršyklės versijos. Pvz.,

$sausainis = $cgi->cookie(-httponly=1,-secure=>1,
       -name=>'pastaba',-value=>'Nauja pastaba.');

Labai naudingas gali būti "expire" atributas, apibrėžiantis "sausainio" galiojimo laiką, pvz., nustatant devynių dienų galiojimo laikotarpį:

$sausainis = $cgi->cookie(-expire=>'+9d',
        -domain=>'.lithuanian.net', -path=>'/cgi-bin/tools',
       -name=>'pastaba',-value=>'Nauja pastaba.', -secure=>0);

Jei nenurodomas jokia "expire" reikšmė, "sausainis" galioja visam laikui. Tačiau galima netgi nurodyti galiojimo laiką "į praeitį", kas reiškia, kad "sausainis" iškart tampa nebegaliojančiu, pvz.,

$sausainis = $cgi->cookie(-expire=>'-1d',
       -name=>'pastaba',-value=>'Nauja pastaba.');

Tai atitinka tokį kreipinį:

$sausainis = $cgi->cookie(-expire=>'now',
       -name=>'pastaba',-value=>'Nauja pastaba.');

"expire" atribute galima nurodyti kelis laiko matavimo vienetus: now – iškart, s – sekundėmis, m – minutėmis, h – valandomis, M – mėnesiais, y – metais, tiksliai nurodytą laiko momentą, pvz.,

$sausainis = $cgi->cookie(-expire=>'Monday, 13-Aug-2012 09:30:00 GMT',
       -name=>'pastaba',-value=>'Nauja pastaba.');

Galima sukurti ir bendrauti ne vieno, o kelių "sausainių" pagalba, pavyzdžiui,

$s1 = $cgi->cookie(-name=>'vardas',-value=>'Jonas');
$s2 = $cgi->cookie(-name=>'amzius',-value=>'23');
print $cgi-header(-cookie=>$s1,-cookie=>$s2);

Paskutinę eilutę galima perrašyti panaudojant masyvo elementą:

print $cgi-header(-cookie=>[$s1, $s2]);

Sausainyje galima įsiminti ne tik vieną reikšmę, bet ir masyvą, ar net asociatyvųjį masyvą, pvz.,

$sausainis = $cgi->cookie(-name=>'vaikai',-value=>\%vaiku_amzius);

Jo reikšmes paimsime analogiškai:

%vaiku_amzius = $cgi->cookie('vaikai');

Pavyzdys

Išvardijami visi skriptui perduotų sausainių vardai (be reikšmių):

#!/usr/bin/perl
use CGI;
$cgi = new CGI;

print $cgi->header(-type=>'text/html; charset=windows-1257');
print $cgi->start_html(-title=>'Sausainių sąrašas');

@sausainiai = $cgi->cookie();
print "<P>Gauti sausainiai:<BR>\n";
for ($K=0; $K <= $#sausainiai; $K++) {
    print $sausainiai[$K];
    print "<BR>\n";
}
print $cgi->end_html();

Funkciškai orientuotas programavimo būdas

CGI.pm numato du programavimo stilius: objektiškai orientuotą ir funkciškai orientuotą. Programuojant funkciškai orientuotu būdu, darbui su "sausainiais" naudojama CGI::Cookie sąsaja. Pateiksime paprastą pavyzdį, išsiunčiantį "sausainį", o taip pat pateikiantį visų gautų "sausainių" reikšmes (laikant, kad visos jos yra tik teksto eilutės):

#!/usr/bin/perl
USE CGI qw/:standard/;
Use CGI::Cookie;

my $sausainis = new CGI::Cookie(-name=>'pastaba',-value=>'Nauja pastaba.');
print header(-cookie=>$sausainis);

print start_html(-title=>'Sausainių sąrašas');

my %sausainiai = fetch CGI::Cookie;
foreach $vardas (keys %sausainiai)  {
    print "$vardas=$sausainiai{$vardas} <BR>\n";
}
print end_html();

Pastaba: Bendrasis CGI.pm aprašymas bus pateikiamas kitame puslapyje (ateityje).

Ankstesnės "Advanced HTML" skyrelio temos:
Ruby on Rails
Unix komandinės eilutė
Dygios JavaScript eilutės
Sveikųjų skaičių žaidimai
ASP patarimų liūnas
JavaScript atspindžiai
Pelė uodega švystelėjo...
Pitonas, kandantis sau uodegą
Viešojo rakto kriptografija
Tikroji Interneto pabaiga
Ką delne mums neša HTML 4.0?
Įlįskite į lankytojų kailį
Įvadas į Perl kalbą: Kas naudoja Perl?
Kaip sužinoti ekrano charakteristikas?
Vaizdi rašysena - VB Script
Kaip atsiranda piešinukai?
Papildytoji tikrovė

Debesies architektūra
JavaScript pradmenys
Skriptai - ateities kalbos?
AWK kalba - sena ir nuolat aktuali
Lambda išraiškos – Java į naują lygį
Nutylimųjų savybių ieškant
Vartiklis