Programovanie

Sledovanie vypršania platnosti relácie v prehliadači

Existuje teda tá zložitá heterogénna webová aplikácia, ktorej časti AJAX sa robia ručne aj pomocou rámcov, viacerých kontextových okien atď. Veľký úctyhodný klient vás osloví s požiadavkou zneplatniť, zavrieť alebo vykonať inú činnosť na celom webe okná aplikácie raz vyprší čas relácie HTTP. Dúfajme, že viete, ako riadiť časový limit relácie HTTP, pre webovú aplikáciu kompatibilnú s J2EE sa to robí zo súboru web.xml (avšak na mnohých serveroch aplikácií sa to nerobí štandardným spôsobom). Na 10 minútový oddychový čas je to:

  10  

Požiadavka na klienta nie je vôbec absurdná a z pohľadu koncového používateľa má dokonalý zmysel, ale pre vývojára sa môže stať hroznou bolesťou, pretože: 1. Nemôžete len spustiť odpočítavací časovač v okne prehliadača pri každom načítaní stránky. zavrieť okno po uplynutí časového limitu. Tento prístup fungoval vo svete, ktorý nie je AJAX, keď každá interakcia prehliadača a servera mala za následok opätovné načítanie okna prehliadača. 2. Na server nemôžete zadať dotaz, aby ste skontrolovali, či relácia HTTP vypršala alebo nie, pretože každý takýto dotaz sa bude považovať za interakciu prehliadača a servera, ktorá predĺži reláciu. To povedie k nikdy nevypršajúcej relácii. 3. Môžete vytvoriť samostatnú webovú aplikáciu, ktorá si bude vedomá relácie HTTP primárnej webovej aplikácie a bude sa s ňou pretínať. Je to však nadmerná práca a pravdepodobnosť prijatia takéhoto riešenia je extrémne nízka z dôvodu pravdepodobných problémov s integráciou. 4. Môžete sa pokúsiť zachytiť všetky interakcie servera AJAX s nejakým pokročilým kódom podobným hackingu a pomôže vám to vysporiadať sa s vašim aktuálnym oknom. To však nefunguje v prípade viacerých otvorených okien - jednoducho nemôžete komunikovať medzi oknami prehľadávača. Jediným spôsobom, ako hovoriť s niektorým otvoreným oknom z primárneho, je použitie odkazu na JavaScript v inom okne. Po opätovnom načítaní alebo nasmerovaní primárneho okna na iné miesto stratí všetky odkazy na JavaScript v iných oknách. 5. Najrealistickejším prístupom je robiť periodické požiadavky XMLHTTP JavaScriptu (z každého otvoreného okna) na server každých {session max inactive interval} +10 sekúnd. To nakoniec zavrie všetky okná, ale môže to mať za následok zavretie okien (minúty alebo dokonca hodiny v závislosti od nastavenia časového limitu relácie webovej aplikácie) po zničení relácie HTTP, napr. po odhlásení používateľa z primárneho okna. Už vám neostávajú žiadne možnosti, ste frustrovaní a myslíte si, že je ten pravý čas vziať otcovi zbraň a zajtra zastreliť spolužiakov v škole. Nie, ešte nie, ešte vždy existuje cesta von! Cesta von nie je veľmi priama, ale je veľmi elegantná. Súbory cookie nám pomôžu. Dalo by sa myslieť, že doba platnosti cookies bude stačiť. Bohužiaľ, ako je opísané v

toto

článku, nemôžete sa spoliehať na čas vypršania platnosti súborov cookie, pretože je meraný klientskym prehliadačom a nikto nemôže zaručiť, že systémové hodiny klienta nezostanú o rok pozadu. Takže tu je Systém a metóda na sledovanie časových limitov relácií HTTP v heterogénnych webových aplikáciách. Na každú žiadosť odoslanú z prehliadača na server sa pomocou servletového filtra nastavia dva súbory cookie. Jeden uchováva aktuálny čas servera a druhý uchováva čas vypršania platnosti relácie. Aktuálny čas servera je potrebný iba na výpočet posunu medzi klientom a serverom. Čas vypršania platnosti relácie sa potom pravidelne kontroluje oproti _vypočítanému_ aktuálnemu času servera (pamätajte na posun). Zakaždým, keď sa na server zadá _any_ požiadavka, aktualizuje sa súbor cookie s vypršaním platnosti a celé to jednoducho funguje. V praxi sa táto metóda realizuje iba v troch krokoch: 1. Vytvorte filter servletu, ktorý by filtroval každú požiadavku na vašu webovú aplikáciu. Nakonfigurujte ho v súbore web.xml takto:

  SessionTimeoutCookieFilter some.package.SessionTimeoutCookieFilter SessionTimeoutCookieFilter / * 

Nerobte si starosti s výkonom svojich webových aplikácií - tento filter je VEĽMI primitívny, stačí ak do odpovede pridáte dva súbory cookie:

 public void doFilter (ServletRequest req, ServletResponse resp, FilterChain filterChain) hodí IOException, ServletException {HttpServletResponse httpResp = (HttpServletResponse) resp; HttpServletRequest httpReq = (HttpServletRequest) požiadavka; longcurTime = System.currentTimeMillis (); long expiryTime = currencyTime + session.getMaxInactiveInterval () * 1000; Cookie cookie = nový Cookie ("serverTime", "" + currencyTime); cookie.setPath ("/"); httpResp.addCookie (cookie); if (httpReq.getRemoteUser ()! = null) {cookie = nový súbor cookie ("sessionExpiry", "" + expiryTime); } else {cookie = nový Cookie ("sessionExpiry", "" + currencyTime); } cookie.setPath ("/"); httpResponse.addCookie (cookie); filterChain.doFilter (req, resp); } 

Nastavenie cesty (v našom prípade na „/“) je veľmi dôležité. Ak nastavenie cesty vynecháte, prehľadávač ho automaticky vypočíta z adresy URL, čo bude mať za následok chaos vo vašom úložisku súborov cookie. 2. Na výpočet posunu medzi časom servera a klienta potrebujeme v každom okne malý JavaScript. Je potrebné ho spustiť iba raz, ale nebolo by na škodu spustiť ho pri každom načítaní stránky:

 funkcia calcOffset () {var serverTime = getCookie ('serverTime'); serverTime = serverTime == null? null: Math.abs (serverTime); var clientTimeOffset = (nový dátum ()). getTime () - serverTime; setCookie ('clientTimeOffset', clientTimeOffset); } window.onLoad = function () {calcOffset (); }; 

3. A nakoniec potrebujeme funkciu, ktorá by skutočne kontrolovala, či relácia vypršala. Je potrebné ho vykonávať pravidelne, v našom prípade každých 10 sekúnd (alebo 10 000 milisekúnd):

 funkcia checkSession () {var sessionExpiry = Math.abs (getCookie ('sessionExpiry')); var timeOffset = Math.abs (getCookie ('clientTimeOffset')); var localTime = (nový dátum ()). getTime (); if (localTime - timeOffset> (sessionExpiry + 15000)) {// 15 ďalších sekúnd navyše, aby sa zabezpečilo, že window.close (); } else {setTimeout ('checkSession ()', 10 000); }} 

Zatvorenie okien prehliadača po skončení platnosti relácie je skutočne čistá brutalita a môže a malo by byť sprevádzané varovnou správou, ktorá sa objaví ako minúta pred vypršaním časového limitu relácie. Naozaj ma zaujíma, aby som dostal vašu

kritická spätná väzba

na moju metódu.

Tento príbeh, „Sledovanie vypršania platnosti relácie v prehliadači“, bol pôvodne publikovaný spoločnosťou JavaWorld.

$config[zx-auto] not found$config[zx-overlay] not found