Ohjelmointi

Seurantaistunnon päättyminen selaimessa

Joten on olemassa monimutkainen heterogeeninen verkkosovellus, jossa AJAX-osat tehdään sekä manuaalisesti että kehyksillä, useilla ponnahdusikkunoilla jne. Suuri kunnioitettava asiakas lähestyy sinua vaatimalla mitättömäksi tekemistä, sulkemista tai jonkin muun toiminnan tekemistä kaikessa verkossa sovellusikkunat, kun HTTP-istunto aikakatkaistaan. Toivottavasti osaat hallita HTTP-istunnon aikakatkaisuaikaa, J2EE-yhteensopivan verkkosovelluksen kohdalla se tehdään web.xml-tiedostosta (kuitenkin useissa sovelluspalvelimissa se ei tapahdu tavalliseen tapaan). 10 minuutin aikakatkaisu on:

  10  

Asiakkaan vaatimus ei ole lainkaan järjetön, ja sillä on täydellinen merkitys loppukäyttäjän näkökulmasta, mutta siitä voi tulla kauhea tuska kehittäjälle, koska: 1. Et voi vain käynnistää ajastinta selainikkunassa aina, kun sivu latautuu sulkea ikkuna aikakatkaisun jälkeen. Tämä lähestymistapa toimi muussa kuin AJAX-maailmassa, kun jokainen selaimen ja palvelimen välinen vuorovaikutus johti selainikkunan lataamiseen uudelleen. 2. Et voi kysyä palvelimelta tarkistaaksesi, onko HTTP-istunnossa aikakatkaisu vai ei, koska kutakin tällaista kyselyä käsitellään selaimen ja palvelimen välisenä vuorovaikutuksena, joka pidentää istuntoa. Tämä johtaa koskaan päättyvään istuntoon. 3. Voit luoda erillisen verkkosovelluksen tietäen ensisijaisen verkkosovelluksen HTTP-istunnon ja leikkaamalla sen. Mutta se on ylivoimainen, ja mahdollisuudet tällaisen ratkaisun hyväksymiseen ovat erittäin pienet todennäköisesti syntyvien integraatiokysymysten vuoksi. 4. Voit yrittää siepata kaikki AJAX-selain-palvelin-vuorovaikutukset edistyneellä hakkeroinnin kaltaisella koodilla, ja se auttaa sinua käsittelemään nykyistä ikkunaasi. Mutta tämä ei toimi useiden avoimien ikkunoiden tapauksessa - et vain voi kommunikoida selainikkunoiden välillä. Ainoa tapa puhua joillekin avoimelle ikkunalle ensisijaisesta on käyttää toisen ikkunan JavaScript-viitteitä, ja kun ensisijainen ikkuna ladataan tai ohjataan toiseen sijaintiin, se menettää kaikki JavaScript-viitteet muihin ikkunoihin. 5. Realistisin tapa on tehdä ajoittain JavaScriptiä koskevia XMLHTTP-pyyntöjä (kustakin avoimesta ikkunasta) palvelimelle jokaista {istunnon enimmäisaktiivinen väli} +10 sekuntia. Tämä lopulta sulkee kaikki ikkunat, mutta saattaa johtaa ikkunoiden suljettuihin minuutteihin (tai jopa tunteihin riippuen verkkosovelluksen istunnon aikakatkaisuasetuksesta) sen jälkeen, kun HTTP-istunto tuhoutuu, esim. kun käyttäjä kirjautuu ulos pääikkunasta. Ei enää vaihtoehtoja, olet turhautunut ja luulet, että on juuri oikea aika ottaa isäsi ase ja ampua luokkatoverisi koulussa huomenna. Ei, ei vielä lapsi - ulospääsyä on vielä! Uloskäynti ei ole kovin suoraviivainen, mutta on erittäin tyylikäs. Evästeet auttavat meitä. Voisi ajatella, että evästeiden vanhentumisaika tekisi temppu. Valitettavasti, kuten on kuvattu

Tämä

artikkeli, et voi luottaa evästeiden vanhentumisaikaan, koska se mitataan asiakasselaimella, eikä kukaan voi taata, että asiakasjärjestelmän kello ei ole vuotta jäljessä. Joten tässä on järjestelmä ja menetelmä HTTP-istunnon aikakatkaisujen seuraamiseksi heterogeenisissä verkkosovelluksissa. Servlet-suodatin asettaa kaksi evästettä jokaisesta selaimelta palvelimelle tehdystä pyynnöstä. Yksi pitää palvelimen nykyisen ajan ja toinen istunnon päättymisaika. Palvelimen nykyinen aika tarvitaan vain laskemaan siirtymä asiakkaan ja palvelimen välillä. Istunnon vanhentumisaika tarkistetaan sitten säännöllisesti _ laskettu_ nykyisen palvelimen ajan suhteen (muista siirtymä). Joka kerta kun _yhtäkään_pyyntö lähetetään palvelimelle, vanhentumiseväste päivitetään, ja koko asia vain toimii. Käytännössä tämä menetelmä toteutetaan vain kolmessa vaiheessa: 1. Luo servlet-suodatin, joka suodattaa kaikki verkkosovelluksesi pyynnöt. Määritä se web.xml-tiedostossa näin:

  SessionTimeoutCookieFilter some.package.SessionTimeoutCookieFilter SessionTimeoutCookieFilter / * 

Älä ole huolissasi verkkosovelluksesi suorituskyvystä - tämä suodatin on ERITTÄIN primitiivinen, se lisää vain kahden evästeen lisäämisen vastaukseen:

 public void doFilter (ServletRequest req, ServletResponse resp, FilterChain filterChain) heittää IOException, ServletException {HttpServletResponse httpResp = (HttpServletResponse) resp; HttpServletRequest httpReq = (HttpServletRequest) kysely; pitkä currTime = System.currentTimeMillis (); long expiryTime = currTime + session.getMaxInactiveInterval () * 1000; Evästeeväste = uusi eväste ("serverTime", "" + currTime); eväste.setPath ("/"); httpResp.addCookie (eväste); if (httpReq.getRemoteUser ()! = null) {eväste = uusi eväste ("sessionExpiry", "" + expiryTime); } else {cookie = uusi eväste ("sessionExpiry", "" + currTime); } eväste.setPath ("/"); httpResponse.addCookie (eväste); filterChain.doFilter (kysy, tai); } 

Polun asettaminen (tapauksessamme "/") on erittäin tärkeää. Jos jätät polun asettamisen väliin, selain laskee sen automaattisesti URL-osoitteesta, mikä johtaa kaaokseen selaimesi evästetallennustilassa. 2. Tarvitsemme jokaisessa ikkunassa pienen JavaScriptin, jotta voimme laskea palvelimen ja asiakasajan välisen siirtymän. Se on suoritettava vain kerran, mutta se ei vahingoita suorittaa se jokaisella sivulatauksella:

 funktio calcOffset () {var serverTime = getCookie ('serverTime'); serverTime = serverTime == null? null: Math.abs (serverTime); var clientTimeOffset = (uusi päivämäärä ()). getTime () - serverTime; setCookie ('clientTimeOffset', clientTimeOffset); } ikkuna.onLoad = funktio () {calcOffset (); }; 

3. Ja lopuksi tarvitsemme toiminnon, joka todella tarkistaa, onko istunto aikakatkaistu. Se on suoritettava säännöllisesti, tapauksessamme joka 10 sekunti (tai 10000 millisekuntia):

 function checkSession () {var sessionExpiry = Math.abs (getCookie ('sessionExpiry')); var timeOffset = Math.abs (getCookie ('clientTimeOffset')); var localTime = (uusi päivämäärä ()). getTime (); if (localTime - timeOffset> (sessionExpiry + 15000)) {// 15 ylimääräistä sekuntia varmistaaksesi, että window.close (); } else {setTimeout ('checkSession ()', 10000); }} 

Selainikkunoiden sulkeminen istunnon päättyessä on todellakin raakaa, ja siihen voi ja sen pitäisi liittyä varoitusviesti, joka ilmestyy kuin minuutti ennen istunnon aikakatkaisua. Olen todella kiinnostunut saamaan sinun

kriittinen palaute

menetelmälleni.

Tämän tarinan "Seurantaistunnon päättyminen selaimessa" julkaisi alun perin JavaWorld.

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