JavaServer Pages – práca s cookies

14. února 2003

Pravdepodobne všetci vieme, čo sú to cookies. Správne, sú to koláčiky, ktorými občas server nakŕmi hladného klienta. Ale keďže klient nie je lakomý, pri ďalšej návšteve ponúkne koláčikom zasa on server. Poďme sa teda pozrieť, ako sa pečú koláčiky pomocou JSP.

Ale teraz už vážne. Cookies sú samozrejme krátke textové informácie, ktoré server môže poslať klientovi pri žiadosti o konkrétnu stránku. Klient si tieto informácie uloží a neskôr ich vráti serveru v nezmenenej podobe. Cookies môžeme využiť napríklad takto:

  • internetový obchod
    Ak potrebujeme identifikovať zákazníka počas jeho sedenia (session). Internetové obchody používajú nákupný košík, do ktorého si zákazník postupne vkladá tovar, ktorý môže byť na rôznych stránkach. Keďže http spojenie je ukončené po prevzatí stránky, server nemá možnosť pri pridávaní novej položky do košíka zistiť, že ide o toho istého zákazníka, ktorý si vložil predchádzajúce položky. Práve na vyriešenie tohto problému môžeme využiť cookies.
  • zadávanie mena a hesla
    Veľa portálov vyžaduje registráciu návštevníka. Po zaregistrovaní dostane užívateľ prihlasovacie meno a heslo. Je príjemné, ak sa nemusí znova prihlasovať pri ďalšej návšteve, ale server ho automaticky identifikuje. Je to možné pomocou cookies. Samozrejme takéto riešenie nie je vhodné pre všetky aplikácie, napríklad pre internet banking je vyložene nevhodné.

Určite by sme našli aj ďalšie uplatnenia. Pri cookies však treba myslieť na určité skutočnosti. Napríklad cookies nie sú šifrované (ide o text), preto posielať takto čísla kreditiek je prinajmenšom hazard. Cookies sa žiadnym spôsobom neinterpretujú ani nevykonávajú, preto nemôžu spôsobiť zavírenie počítača ani ho iným spôsobom napadnúť.

Jazyk Java, resp. jeho Enterprise Edition (J2EE), obsahuje kompletné API pre prácu s cookies. Potrebne metódy sú v triede javax.servlet.http.Cookie. Trieda Cookie obsahuje len jeden konštruktor, ktorý očakáva dva parametre typu java.lang.String. Prvý parameter je meno a druhý je hodnota vytváranej cookie.

<%@ page import=“javax.servlet.http.*“ %>
<% String name = „id“;
String value = „u1578“;
Cookie myCookie = new Cookie(name,value); %>

Zdá sa, že cookie máme vytvorené. Ale to neznamená, že server ho aj poslal klientovi. Zatiaľ je stav taký, že máme vytvorený objekt Cookie, ktorý nie je NULL a má meno a hodnotu. Aby bolo vytvorené cookie pri požiadavke na stránku aj poslané klientovi, musíme zavolať metódu addCookie(Cookie). Pozor, táto metóda nie je z triedy Cookie, ale z javax.servlet.HttpServletResponse.

<%@ page import=“javax.servlet.HttpServletResponse“ %>
<% response.addCookie(myCookie); %>

Všimnite si prosím, že nevytvárame objekt triedy HttpServletResponse pomenovaný response, ale hneď voláme jeho metódu. Je to tým, že response je tzv. implicitný objekt vytváraný automaticky. To znamená, že dokonca ani nemusím robiť import tejto triedy, pretože sa robí automaticky. Ale ak aj urobím, nič tým nepokazím. Viac informácií nájdete v časti JavaServer Pages – implicitné objekty a direktívy.

Zavolaním metódy addCookie(Cookie) objektu response sa pridá do http hlavičky stránky Set-Cookie. Týmto spôsobom môžete vložiť viacero rôznych cookies. Trieda Cookie poskytuje programátorovi aj ďalšie metódy. Takmer všetko sú to setXxx/getXxx metódy. Napríklad:

  • setDomain(String)/getDomain() – nastavuje/vracia doménu, ktorú daná cookie má prezentovať. Normálne je cookie poslaná browserom na toho istého hostiteľa, z ktorého bola poslaná. Pomocou setDomain() môžeme určiť aj iného, ktorému bude cookie poslaná. Názov hostiteľa musí byť podľa RFC 2109.
  • setMaxAge(int)/getMaxAge() – nastavuje/vracia maximálny čas životnosti cookie v sekundách. Ak zadáte celé kladné číslo, cookie bude uchovaná aj po ukončení browsera. Ak zadáte nulu, cookie bude klientom zmazaná. Záporná hodnota spôsobí, že cookie prežije len do okamihu ukončenia browsera, potom bude tiež zmazaná.
  • setSecure(boolean)/getSecure() – prvá z dvojice metód určuje, či má byť cookie poslaná výhradne pomocou bezpečného pripojenia SSL (true), alebo môže byť aj pomocou bežného (false). Druhá metóda zistí aktuálny stav. Vráti true, ak cookie má byť poslaná výhradne cez SSL.
  • setPath(String)/getPath() – cookie je štandartne viditeľná pre všetky URL v tom istom adresári ako aktuálna stránka, aj pre všetky podadresáre. Ak chcete špecifikovať niečo iné, napríklad aby bolo cookie viditeľné pre všetky stránky na servery, použite metódu setPath("/").

Všetky tieto metódy musíte zavolať skôr ako zavoláte metódu addCookie().

<%@ page import=“javax.servlet.http.*“ %>
<%@ page import=“javax.servlet.HttpServletResponse“ %>
<% String name = „id“;
String value = „u1578“;
Cookie myCookie = new Cookie(name,value);
myCookie.setDomain(„.interval.cz“);
myCookie.setMaxAge(60*60*24*31); //jeden mesiac
response.addCookie(myCookie); %>

Poslednou vecou, ktorú potrebujeme vedieť, je ako získať obsah cookie, ktoré pošle klient späť serveru. Java API nám poskytuje niekoľko užitočných metód:

  • getCookies() – metóda objektu triedy javax.servlet.HttpServletRequest, vráti pole objektov triedy Cookies. Každý objekt tohto pola v sebe drží meno a hodnotu konkrétnej cookie. Tieto dva údaje je možné získať pomocou nasledujúcich metód.
  • getName()/getValue() – vráti názov/hodnotu cookie.

<% Cookie[] cookies = request.getCookies();
if (cookies != null) {
 String name = cookies[0].getName();
 String value = cookies[0].getValue();
 out.print(„Meno :“+name+ “ Hodnota :“+value+“<br>“);
} %>

Vyššie uvedeným spôsobom vypíšem obsah a meno len jednej a prvej cookie v poli. V prípade, že chcem vypísať obsah všetkých cookies v poli použijem cyklus for:

<% Cookie[] cookies = request.getCookies();
String name;
String value;
for (int i = 0; i < cookies.length; i++) {
 name = cookies[i].getName();
 value = cookies[i].getValue();
 out.print(„Meno :“+name+ “ Hodnota :“+value+“<br>“);
} %>

V príklade pre jednoduchosť hodnotu každej cookie hneď vypisujem. V praxi by som však takto zistenú hodnotu pravdepodobne využil iným spôsobom. Napríklad na základe získaného ID by som mohol urobiť dotaz do databázy. Myslím, že používanie cookies na stránkach JSP je pomerne jednoduché. Samozrejme je už na konkrétnom programátorovi, ako dokáže využiť tento nástroj, ako a kedy cookies použije. Treba však myslieť na bezpečnosť a na to, že užívateľ môže mať používanie cookies zakázané.

Pripravil som pre vás jednoduchý príklad. (Tento príklad si tiež môžete stiahnuť.) Pri prvej požiadavke na stránku vám bude pridelené ID. Toto ID je náhodne vygenerovaný reťazec. Názov ID je automaticky JSESSIONID. Ak sa znova vrátite na stránku s príkladom zobrazí sa vám hodnota vášho JSESSIONID. V kóde je časť zakomentovaná. Môžete si ju skúsiť odkomentovať a vyskúšať.

Starší komentáře ke článku

Pokud máte zájem o starší komentáře k tomuto článku, naleznete je zde.

Štítky: Články

Mohlo by vás také zajímat

Nejnovější

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *