V minulom článku sme preberali použitie cookies a prepisu URL ako techniky na sledovanie stavu medzi requestami. Samozrejme, že môžete tieto techniky použiť aj z iného dôvodu, veľmi často sa napríklad cookies používajú na pridelenie identifikátora klientovi, pri prvej požiadavke na servlet. Na základe tohoto ID potom servlet identifikuje prichádzajúce požiadavky…

Na prvý pohľad je ťažko nájsť zásadný rozdiel medzi state a session trackingom. V podstate by sme mohli povedať, že ide o približne rovnakú techniku. Rozdiel je asi v tom, že state tracking neposkytuje na úrovni Servlet API programátorovi žiadne špecializované triedy, ktoré by zabezpečovali určité štandardné úlohy. Je teda plne na ňom manuálne zabezpečiť vytváranie a čítanie cookies, prepisovanie URL, manažovanie obslužných objektov a podobne. Session tracking mechanizmus je podporovaný priamo Servlet API a to rozhraním javax.servlet.http.HttpSession. Obrovskou výhodou tohto mechanizmu je, zjednodušene, že programátor sa nemusí starať o cookies, URL rewriting atd. Rozhranie HttpSession obsahuje metódy na vytvorenie a manažovanie sedení. Je technicky postavené nad cookies aj prepis URL.

Vytvorenie session

Na vytvorenie objektu triedy HttpSession sa treba obrátiť na objekt triedy HttpRequest. Z toho vyplýva, že vytvorenie session je združené s požiadavkou, prostredníctvom metódy getSession().

HttpSession session = request.getSession();
HttpSession session = request.getSession(boolean create);

Metóda getSession() vráti existujúci objekt session združený s aktuálnou požiadavkou, alebo, ak žiadny zatiaľ nebol vytvorený, vytvorí ho. Metóda getSession(boolean create) funguje rovnako ako predchádzajúca s tým rozdielom, že vytvorí nový objekt session len vtedy, ak ešte vytvorený nie je a zároveň logická premenná create je true.

Pridelenie a získanie atribútov

Objekt session by bol úplne zbytočný, keby neumožnil asociovať iné objekty s aktuálnym sedením. Z toho dôvodu obsahuje metódy setAttribute() a getAttribute().

session.setAttribute(String name, Object value); // nastav
Object object = (Object)session.getAttribute(String name); // čítaj
session.removeAttribute(String name); // odstráň atribút

Z uvedeného fragmentu je zrejmé, že každý atribút treba pomenovať. Meno je jeho jednoznačný identifikátor. Ak by ste teda vložili nový atribút s tým istým menom, nahradili by ste ten pôvodný, pričom by vôbec nezáležalo na type (triede) vloženého objektu atribútu. Ďalej si všimnite, že do session môžete vložiť len objekty, teda nie primitívne dátové typy. Našťastie každý primitívny dátový typ má svoj objektový ekvivalent. Pri získavaní hodnoty atribútu cez getAttribute() musíte nastaviť (pretypovať) hodnotu atribútu na požadovaný objektový typ. Metóda removeAttribute() zabezpečí odstránenie konkrétneho objektu z danej session.

Reagovanie na udalosti

Java Servlet API 2.3 nám dáva k dispozícii niekoľko rozhraní, implementáciou ktorých zabezpečíme, že nami vybrané objekty môžu reagovať na udalosti vzniknuté priamo v objekte session alebo v kontexte danej web aplikácie, na zmeny v zozname aktívnych sessions. Konkrétne sa jedná o tieto rozhrania:

  1. javax.servlet.http.HttpSessionListener – všetky objekty implementujúce toto rozhranie budú v rámci danej web aplikácie notifikované v prípade, ak príde k zmene v zozname aktívnych sedení. Obsahuje tieto metódy:
    • sessionCreated(HttpSessionEvent se) – bude zavolaná po vytvorení novej session
    • sessionDestroyed(HttpSessionEvent se) – bude zavolaná po skončení session
  2. javax.servlet.http.HttpSessionActivationListener – objekty, pripojené k danej session, implementujúce toto rozhranie budú notifikované pri aktivácii alebo pasivácii danej session. A to prostredníctvom týchto metód:
    • sessionDidActivate(HttpSessionEvent se) – bude zavolaná po aktivácii session
    • sessionWillPassivate(HttpSessionEvent se) – bude zavolaná pred pasiváciou session
  3. javax.servlet.http.HttpSessionAttributeListener – v prípade zmeny týkajúcej sa atribútov danej session budú notifikované všetky objekty s týmto rozhraním.
    • attributeAdded(HttpSessionBindingEvent sbe) – bude zavolaná po pridaní nového atribútu
    • attributeRemoved(HttpSessionBindingEvent sbe) – bude zavolaná po odstránení atribútu
    • attributeReplaced(HttpSessionBindingEvent sbe) – bude zavolaná po nahradení atribútu novým
  4. javax.servlet.http.HttpSessionBindingListener – objekt bude notifikovaný ak bude pripojený alebo odstránený z danej session. A to len vtedy ak implementuje toto rozhranie. Objekt môže byť explicitne programovo odpojený, alebo ak session je ukončená programovo, alebo vyprší platnosť session a tá je ukončená priamo kontajnerom.
    • valueBound(HttpSessionBindingEvent sbe) – bude zavolaná po pripojení objektu k session
    • valueUnbound(HttpSessionBindingEvent sbe) – bude zavolaná po odstránení objektu zo session

Vyššie uvedené rozhrania používajú dve triedy javax.servlet.http.HttpSessionEvent a javax.servlet.http.HttpSessionBindingEvent. Tieto triedy obsahujú pár užitočných metód, ktoré vám umožnia získať napríklad objekt session, o ktorý sa jedná pri vzniku určitej udalosti. Alebo meno a hodnotu objektu, ktorý bol pridaný (zmenený, odobratý) ako atribút.

Ukončenie session

Session je možné ukončiť dvoma spôsobmi. Buď programovo pomocou metódy invalidate() alebo uplynutím časového intervalu. Tento interval je možné nastaviť tiež dvoma spôsobmi. Priamo v kóde prostredníctvom metódy setMaxInactiveInterval() alebo explicitne v konfiguračnom súbore web.xml.

<!– ====== Default Session Configuration ====== –>
<!– You can set the default session timeout (in minutes) for all newly –>
<!– created sessions by modifying the value below. –>
<session-config>
    <session-timeout>30</session-timeout>
</session-config>

Pričom Tomcat server obsahuje jednak globálny web.xml v CATALINA_HOME\conf\ a zároveň každá web aplikácia môže mať svoj vlastný web.xml súbor. Poradie načítania a priority jednotlivých elementov súboru web.xml je nasledovné:

Schéma postupnosti čítania konfiguračných parametrov

Ako prvý sa číta globálny súbor, potom lokálny a nakoniec sa kompiluje (vykoná) samotný servlet. Taká istá je aj priorita. Ak v globálnom súbore nastavíme timeout na 30 minút, v lokálnom na 10 a v samotnom servlete na 60 minút, session bude ukončená po 60 minútach nečinnosti. Šípka číslo tri znamená, že servlet môže čítať z aplikačného konfiguračného súboru.

Dodatok

Rozhranie HttpSession obsahuje ešte ďalšie potrebné metódy. Nebudem ich tu však všetky vymenúvať, pretože sú pekne opísané v dokumentácii k J2EE 1.3 API. Predsa však mi nedá a spomeniem aspoň niektoré. Napríklad metóda isNew() vracia true ak session bola práve vytvorená (nie je na ňu odkaz v aktuálnej požiadavke), v opačnom prípade vráti false. Táto metóda sa môže hodiť, ak potrebujete vykonať určitú akciu len jeden krát po vytvorení session, napríklad nastaviť inicializačné parametre a podobne.

HttpSession session = request.getSession();
  if (session.isNew()) {
    session.setAttribute(„Name“, „User“);
    session.setAttribute(„Password“, „XXX“);
  }

Metóda getId() vráti unikátny String identifikujúci danú session. Tvar tohto reťazca je daný servlet kontajnerom, to znamená že je závislý na konkrétnej implementácii špecifikácie servletov. Hodiť sa vám môže aj metóda getCreationTime(), ktorá vráti počet milisekúnd od 1. 1. 1970 do okamihu vytvorenia session. Túto hodnotu môžete potom predať napríklad konštruktoru triedy java.util.Date. Ešte spomeniem metódu getAttributeNames(). Táto vám vráti objekt triedy java.util.Enumeration obsahujúci pole reťazcov predstavujúce názvy všetkých atribútov v danej session.

V ďalšom článku si vytvoríme a prejdeme príklad, využívajúci dnes prebraté poznatky.

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

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

Žádný příspěvek v diskuzi

Odpovědět