Programmēšana

Sesijas derīguma termiņa izsekošana pārlūkprogrammā

Tātad ir sarežģītā neviendabīgā tīmekļa lietojumprogramma, kurā AJAX daļas tiek veiktas gan manuāli, gan ar ietvariem, vairākiem uznirstošajiem logiem utt. lietojumprogrammas logi, kad HTTP sesijas noildze. Cerams, ka jūs zināt, kā kontrolēt HTTP sesijas taimauta intervālu, J2EE saderīgai tīmekļa lietojumprogrammai tas tiek darīts no faila web.xml (tomēr daudzos lietotņu serveros tas netiek darīts standarta veidā). 10 minūtes noildze ir:

  10  

Klienta prasība nebūt nav absurda un ir ļoti jēgpilna no galalietotāja viedokļa, taču tā var kļūt par briesmīgu sāpju izstrādātājam, jo: 1. Katru reizi, kad lapa tiek ielādēta, pārlūka logā jūs nevarat vienkārši ieslēgt atpakaļskaitīšanas taimeri. aizveriet logu pēc taimauta. Šī pieeja darbojās pasaulē, kas nav AJAX, kad katra pārlūka un servera mijiedarbība izraisīja pārlūkprogrammas loga pārlādēšanu. 2. Jūs nevarat vaicāt serverim, lai pārbaudītu, vai HTTP sesijai ir iestājies taimauts vai nē, jo katrs šāds vaicājums tiks uzskatīts par pārlūka un servera mijiedarbību, kas pagarina sesiju. Tas novedīs pie tā, ka sesija nekad nebeidzas. 3. Jūs varētu izveidot atsevišķu tīmekļa lietojumprogrammu, apzinoties primārās tīmekļa lietotnes HTTP sesiju un krustojoties ar to. Bet tas ir pārspīlēts, un izredzes, ka šāds risinājums tiks pieņemts, ir ārkārtīgi mazas iespējamo integrācijas problēmu dēļ. 4. Jūs varētu mēģināt pārtvert visas AJAX pārlūka un servera mijiedarbības ar kādu uzlabotu uzlaušanai līdzīgu kodu, un tas palīdzēs jums tikt galā ar pašreizējo logu. Bet tas nedarbojas vairāku atvērto logu gadījumā - jūs vienkārši nevarat sazināties starp pārlūkprogrammas logiem. Vienīgais veids, kā sarunāties ar kādu atvērtu logu no primārā, ir izmantot cita loga JavaScript atsauci, un pēc primārā loga atkārtotas ielādes vai novirzīšanas uz citu vietu tas zaudē visas JavaScript atsauces uz citiem logiem. 5. Reālākā pieeja ir periodiski veikt JavaScript XMLHTTP pieprasījumus (no katra atvērtā loga) serverim katru {session max inactive interval} +10 sekundes. Tas galu galā aizvērs visus logus, taču tas var izraisīt logu slēgšanu minūtes (vai pat stundas atkarībā no tīmekļa lietotnes sesijas taimauta iestatījuma) pēc HTTP sesijas iznīcināšanas, piem. kad lietotājs atteiksies no primārā loga. Vairs nav variantu, jūs esat neapmierināts un domājat, ka ir īstais laiks paņemt tēta pistoli un rīt nošaut klasesbiedrus skolā. Nē, vēl ne bērns - joprojām ir izeja! Izeja nav pārāk vienkārša, bet ir ļoti eleganta. Mums palīdzēs sīkdatnes. Varētu domāt, ka sīkdatņu derīguma termiņš padarīs šo triku. Diemžēl, kā aprakstīts

šo

rakstā, jūs nevarat paļauties uz sīkfailu derīguma termiņu, jo to mēra klienta pārlūks, un neviens nevar garantēt, ka klienta sistēmas pulkstenis nav atpalicis par gadu. Tātad, šeit ir sistēma un metode HTTP sesijas pārtraukumu izsekošanai neviendabīgās tīmekļa lietojumprogrammās. Katram pārlūka pieprasījumam serverim divus sīkfailus iestata servleta filtrs. Vienam ir servera pašreizējais laiks, bet citam - sesijas derīguma termiņš. Servera pašreizējais laiks ir nepieciešams tikai, lai aprēķinātu nobīdi starp klientu un serveri. Pēc tam sesijas derīguma termiņš tiek periodiski pārbaudīts, salīdzinot ar pašreizējo servera _ aprēķināto_ laiku (atcerieties nobīdi). Katru reizi, kad serverim tiek iesniegts _jebkāds pieprasījums, tiek atjaunināts derīguma termiņa sīkfails, un viss vienkārši darbojas. Praksē šī metode tiek realizēta tikai trīs posmos: 1. Izveidojiet servleta filtru, kas filtrētu katru jūsu tīmekļa lietojumprogrammas pieprasījumu. Konfigurējiet to vietnē web.xml šādi:

  SessionTimeoutCookieFilter some.package.SessionTimeoutCookieFilter SessionTimeoutCookieFilter / * 

Neuztraucieties par jūsu tīmekļa lietotņu veiktspēju - šis filtrs ir ĻOTI primitīvs, viss, ko tas dara, ir atbildei pievienot divus sīkfailus:

 public void doFilter (ServletRequest req, ServletResponse resp, FilterChain filterChain) met IOException, ServletException {HttpServletResponse httpResp = (HttpServletResponse) resp; HttpServletRequest httpReq = (HttpServletRequest) req; long currTime = System.currentTimeMillis (); ilgi expiryTime = currTime + session.getMaxInactiveInterval () * 1000; Sīkdatnes sīkfails = jauns sīkfails ("serverTime", "" + currTime); cookie.setPath ("/"); httpResp.addCookie (sīkdatne); if (httpReq.getRemoteUser ()! = null) {sīkfails = jauns sīkfails ("sessionExpiry", "" + expiryTime); } else {cookie = new Cookie ("sessionExpiry", "" + currTime); } cookie.setPath ("/"); httpResponse.addCookie (sīkdatne); filterChain.doFilter (req, resp); } 

Ceļa iestatīšana (mūsu gadījumā uz "/") ir ļoti svarīga. Ja izlaidīsit ceļa iestatīšanu, pārlūks to automātiski aprēķinās no URL, kas jūsu pārlūkprogrammas sīkfailu krātuvē izraisīs haosu. 2. Mums ir nepieciešams neliels JavaScript katrā logā, lai aprēķinātu nobīdi starp servera un klienta laiku. Tas ir jāpalaiž tikai vienu reizi, taču tas nekaitētu, ja to palaistu katrā lapas ielādē:

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

3. Un visbeidzot mums ir nepieciešama funkcija, kas faktiski pārbaudītu, vai sesijai ir iestājies taimauts. Tas jāveic periodiski, mūsu gadījumā ik pēc 10 sekundēm (vai 10000 milisekundēm):

 funkcija checkSession () {var sessionExpiry = Math.abs (getCookie ('sessionExpiry')); var timeOffset = Math.abs (getCookie ('clientTimeOffset')); var localTime = (jauns datums ()). getTime (); if (localTime - timeOffset> (sessionExpiry + 15000)) {// 15 papildu sekundes, lai pārliecinātos, ka window.close (); } else {setTimeout ('checkSession ()', 10000); }} 

Patiešām, pārlūkprogrammas logu aizvēršana pēc sesijas termiņa beigām ir tīra brutalitāte, un to var un vajadzētu pavadīt ar brīdinājuma ziņojumu, kas parādās, piemēram, 1 minūti pirms sesijas noildzes. Man tiešām interesē saņemt jūsu

kritiskas atsauksmes

par manu metodi.

Šo stāstu “Sesijas derīguma termiņa izsekošana pārlūkprogrammā” sākotnēji publicēja JavaWorld.

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