Programavimas

Sesijos galiojimo pabaigos stebėjimas naršyklėje

Taigi yra ta sudėtinga nevienalytė žiniatinklio programa, kai AJAX dalys atliekamos rankiniu būdu, naudojant rėmelius, kelis iššokančiuosius langus ir kt. Didelis garbingas klientas kreipiasi į jus reikalaudamas anuliuoti, uždaryti ar atlikti kitą veiklą visame žiniatinklyje. programos langai, kai pasibaigs HTTP sesijos laikas. Tikimės, kad žinote, kaip valdyti HTTP sesijos skirtojo laiko intervalą. J2EE reikalavimus atitinkančioje žiniatinklio programoje tai daroma iš failo web.xml (tačiau daugelyje programų serverių tai daroma ne standartiniu būdu). 10 minučių skirtasis laikas yra:

  10  

Kliento reikalavimas visiškai nėra absurdiškas ir yra prasmingas iš galutinio vartotojo perspektyvos, tačiau jis gali tapti siaubingu skausmu kūrėjui, nes: 1. Jūs negalite tiesiog paleisti atgalinės atskaitos laikmatį naršyklės lange kiekvieną kartą įkeliant puslapį pasibaigus laikui, uždaryti langą. Šis metodas veikė ne AJAX pasaulyje, kai dėl kiekvienos naršyklės ir serverio sąveikos naršyklės langas buvo įkeltas iš naujo. 2. Negalite pateikti užklausos serveriui, norėdami patikrinti, ar baigėsi HTTP sesijos laikas, ar ne, nes kiekviena tokia užklausa bus traktuojama kaip naršyklės ir serverio sąveika, pratęsianti sesiją. Tai paskatins niekada nesibaigiančią sesiją. 3. Galite sukurti atskirą žiniatinklio programą, žinodami pagrindinės žiniatinklio programos HTTP sesiją ir susikirsdami su ja. Bet tai yra per didelė problema, ir tikimybė, kad toks sprendimas bus priimtas, yra labai maža dėl integracijos problemų, kurios gali kilti. 4. Galite pabandyti perimti visas AJAX naršyklės ir serverio sąveikas naudodami kokį nors išplėstinį į nulaužimą panašų kodą, ir tai padės jums susitvarkyti su dabartiniu langu. Bet tai neveikia kelių atvirų langų atveju - tiesiog negalite bendrauti tarp naršyklės langų. Vienintelis būdas kalbėti su atidarytu langu iš pirminio yra naudoti kito lango „JavaScript“ nuorodą, o įkėlus pagrindinį langą arba nukreipus jį į kitą vietą, jis praranda visas „JavaScript“ nuorodas į kitus langus. 5. Realiausias būdas yra periodiškai teikti „JavaScript“ XMLHTTP užklausas (iš kiekvieno atidaryto lango) į serverį kas {session max inactive interval} +10 sekundžių. Tai galiausiai uždarys visus langus, tačiau po to, kai bus sunaikinta HTTP sesija, langai gali būti uždaryti minutėmis (arba net valandomis, atsižvelgiant į žiniatinklio programos sesijos skirtojo laiko nustatymą), pvz. kai vartotojas atsijungs iš pirminio lango. Nebeliko jokių galimybių, jūs esate nusivylęs ir manote, kad jau pats tinkamiausias laikas paimti tėčio ginklą ir rytoj sušaudyti klasės draugus mokykloje. Ne, dar ne vaikas - vis dar yra išeitis! Išeitis nėra labai paprasta, tačiau yra labai elegantiška. Slapukai mums padės. Galima pagalvoti, kad slapukų galiojimo laikas padarys tą triuką. Deja, kaip aprašyta

tai

straipsnį, negalite pasikliauti slapukų galiojimo laiku, nes jį matuoja kliento naršyklė, ir niekas negali garantuoti, kad kliento sistemos laikrodis neatsilieka vieneriais metais. Taigi, čia yra HTTP sesijos laiko praleidimo sekimo sistema ir metodas heterogeninėse žiniatinklio programose. Kiekvienam prašymui iš naršyklės į serverį servleto filtru nustatomi du slapukai. Vienas laiko serverio dabartinį laiką, o kitas - seanso galiojimo laiką. Serverio dabartinis laikas reikalingas tik norint apskaičiuoti kliento ir serverio poslinkį. Tuomet periodiškai tikrinamas seanso galiojimo laikas pagal _ apskaičiuotą_ dabartinį serverio laiką (prisiminkite poslinkį). Kiekvieną kartą, kai _bet_klausa pateikiama serveriui, galiojimo laiko slapukas atnaujinamas ir visa tai veikia. Praktiškai šis metodas įgyvendinamas tik trimis etapais: 1. Sukurkite servleto filtrą, kuris filtruotų kiekvieną jūsų žiniatinklio programos užklausą. Konfigūruokite jį šiuo adresu: web.xml:

  SessionTimeoutCookieFilter some.package.SessionTimeoutCookieFilter SessionTimeoutCookieFilter / * 

Nesijaudinkite dėl savo žiniatinklio programos našumo - šis filtras yra LABAI primityvus, viskas, ką jums reikia padaryti, yra pridėti du slapukus prie atsakymo:

 public void doFilter („ServletRequest req“, „ServletResponse resp“, „FilterChain“ filterChain) meta IOException, ServletException {HttpServletResponse httpResp = (HttpServletResponse) resp; HttpServletRequest httpReq = (HttpServletRequest) req; ilgas currTime = System.currentTimeMillis (); ilgas galiojimo laikas = currTime + session.getMaxInactiveInterval () * 1000; Slapuko slapukas = naujas slapukas ("serverTime", "" + currTime); slapukas.setPath ("/"); httpResp.addCookie (slapukas); if (httpReq.getRemoteUser ()! = null) {slapukas = naujas slapukas ("sessionExpiry", "" + expiryTime); } else {slapukas = naujas slapukas ("sessionExpiry", "" + currTime); } slapukas.setPath ("/"); httpResponse.addCookie (slapukas); filterChain.doFilter (req, resp); } 

Kelio nustatymas (mūsų atveju „/“) yra labai svarbus. Jei praleisite kelio nustatymą, naršyklė jį automatiškai apskaičiuos iš URL, kuris jūsų naršyklės slapukų saugykloje sukels chaosą. 2. Kiekviename lange mums reikia mažos „JavaScript“, kad būtų galima apskaičiuoti serverio ir kliento laiko poslinkį. Jį reikia paleisti tik vieną kartą, bet nepakenktų paleisti jį kiekvieną kartą įkeliant puslapį:

 funkcija calcOffset () {var serverTime = getCookie ('serverTime'); serverTime = serverTime == null? null: Math.abs (serverTime); var clientTimeOffset = (nauja data ()). getTime () - serverTime; setCookie ('clientTimeOffset', clientTimeOffset); } window.onLoad = function () {calcOffset (); }; 

3. Ir galiausiai mums reikia funkcijos, kuri iš tikrųjų patikrintų, ar sesijos laikas baigėsi. Jis turi būti vykdomas periodiškai, mūsų atveju kas 10 sekundžių (arba 10000 milisekundžių):

 funkcija checkSession () {var sessionExpiry = Math.abs (getCookie ('sessionExpiry')); var timeOffset = Math.abs (getCookie ('clientTimeOffset')); var localTime = (nauja data ()). getTime (); if (localTime - timeOffset> (sessionExpiry + 15000)) {// 15 papildomų sekundžių, kad įsitikintumėte, jog window.close (); } else {setTimeout ('checkSession ()', 10000); }} 

Tiesą sakant, naršyklės langų uždarymas pasibaigus seansui yra grubus brutalumas, be to, jį reikia ir turėtų lydėti įspėjamasis pranešimas, atsirandantis kaip 1 minutė prieš sesijos laiką. Man tikrai įdomu gauti jūsų

kritinis atsiliepimas

mano metodu.

Šią istoriją „Sesijos galiojimo stebėjimas naršyklėje“ iš pradžių paskelbė „JavaWorld“.

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