Vypnutí prodloužení platnosti sessions u přihlášeného uživatele
- ViPEr*CZ*
- Člen | 817
Zdravím, řeším takovou vyjímku. Přes ajax si občas vytáhnu nějakou informaci… jenže to prodlouží dobu platnosti aktuálně zalogovaného uživatele. Jednoduše to způsobuje to, že platnost zalogovaného uživatele nikdy nevyprší, což u této jedné události je nechtěné (nevyvolal ji sám uživatel). Dá se to nějak ošetřit?
- LeonardoCA
- Člen | 296
řešil bych to si tak:
- Ajax nepotřebuje session – zajistit aby ajaxový požadavek session nespouštěl
- Ajax potřebuje session – počítat počet po sobě jdoucích automatických ajaxových požadavků do doby kdy session má vypršet při posledním ohlásit uživatele (nebo smazat session, pokud by se to týkálo i nepříhlášených)
Varianta 2. bude asi jednodušší a spolehlivější (pokud počet přímo odvodíš od konstant pro session expiration a intervalu spouštění ajaxových požadavků)
Editoval LeonardoCA (6. 7. 2012 14:32)
- ViPEr*CZ*
- Člen | 817
No bod jedna by šel, ale pouze u té jedné inkriminované URL… ale raději mít i pro ní nastartovanou session… člověk nikdy neví na co to použije. Bod dva ještě přemýšlím jak pořešit přesně. Myslel jsem, že to půjde nějak jednodušeji. Totiž když běží ten ajax požadavek, tak ten musí v ten okamžik znovu nastavit platnost té dané session na +nějaký čas. Toto kdyby se jen neprovedlo, tak by to bylo jednodušší. Tj. hlavní kontéjnér session mám +365day nastaveno, ale sekce pro samotnýho usera je pouze +15minute a tadle doba se vždy při každým request posune, stačilo by nějak zajistit, aby se toto nestalo.
- KingKoca
- Člen | 25
Ja se bojim, ze o prodluzovani se stara samotne php. Nejsem si jisty, jestli by to slo obejit custom session handlerem. Ty v podstate potrebujes, aby se v konkretnim pripade nevolalo session_start(). A pokud pri zpracovani ajaxoveho pozadavku potrebujes nektere udaje ze session (napr prihlaseneho uzivatele), tento zpusob vyuzit nemuzes.
Bod 2:
- potrebujes rozlisit tvuj request od tech, ktere prodluzuji session
- pokud mas request ktery prodlouzi session, ulozis nekam informaci, ze session prodluzujes.
- pokud mas ajax request, tento krok neprovedes.
Nejjednodussi vec co me napada je:
if($_SERVER['REQUEST_URI'] != '/ajaxovy-pozadavek'){
$_SESSION['lastAction'] = time();
}
if(time() - $_SESSION['lastAction'] >= [doba_expirace]){
$user->logout();
}
Nevim jak se v nette ziska doba expirace nastavena pres
$user->setExpiration(), uvedl jsem proto pouze [doba_expirace]
.
Je dost pravdepodobne, ze existuje i lepsi reseni :)
- LeonardoCA
- Člen | 296
ViPErCZ napsal(a):
ale sekce pro samotnýho usera je pouze +15minute a tadle doba se vždy při každým request posune, stačilo by nějak zajistit, aby se toto nestalo.
To je princip fungovani expirace session, na tom nic nezmenis. Mohl bys sis nastavit session vzdy na dobu kratsi pri ajaxovem pozadavku, ale pak by ses dostal bud na 0 nebo na zapornou hodnotu a stejne by jsi to musel osetrovat tyto stavy. To uz je jednodussi jen pocitat ajax requesty a pak rovnou odhlasit.
- ViPEr*CZ*
- Člen | 817
No nemáte tak úplně pravdu. Zkuste si prostudovat zdrojáky, jak se ověřuje, zda-li jste přihlášení. Samotná expirace, tj. čas kdy vyprší session, je uložená zde:
$this->context->session->getSection('Nette.Http.UserStorage/')->expireTime
O toto se PHP nestará, to si nastavuje framework. Vyřešil jsem to tak, že si ukládám do session předešlou expiraci a pokud jsem v inkriminovaným requestu, tak se nastaví expirace na původní čas.
Editoval ViPEr*CZ* (7. 7. 2012 11:08)