Geniální session v PHP
12.03.2005
Před nedávnem jsem v době psaní příspěvku na tento blog dostal neuvěřitelnou chuť udělat si horkou čokoládu. Tak jsem pohodlně zašel do kuchyňky, připravil si čokoládu a cestou k počítači mě zdrželo nové číslo počítačového magazínu. Nu což blog chvilku počká, nebo ne?
Po přibližně půl hodině jsem klidně usedl odpočatý k svému počítači, dopsal příspěvek, kliknul na tlačítko přidat a ... Ano hádáte správně, systém mě automaticky odhlásil a můj příspěvek skončil v propadlišti dějin a již se jej nikdy nedočkáte.
Kéž bych tento problém měl pouze sám, bohužel jej mají i jiní, třeba naši klienti, kteří si zajdou na oběd do luxusní restaurace a po návratu je systém automaticky odhlásí. Proto jsem se rozhodl upravit weby napsané v PHP tak, aby uživatel po dobu otevření stránky nikdy nebyl automaticky odhlášen.
Můj skript využívá jednoduché funkce javascriptu, jež načte po svém zavolání externí javaskriptový soubor, kterým je samozřejmě PHP soubor generující nové session id.
function refresh()
{
// odmazeme stary skript, pokud existoval
var hlavicka = document.getElementsByTagName('head')[0];
var dataLoader = document.getElementById('scriptLoader');
if(dataLoader) hlavicka.removeChild(dataLoader);
// vytvorime novy element script
script = document.createElement('script');
script.id = 'scriptLoader';
script.src = 'reload.php?reload='+Math.random();
// vlozime do stranky, cimz prohlizec stahne skript
x = document.getElementsByTagName('head')[0];
x.appendChild(script);
timeout();
return false;
}
Poté je potřeba ještě tuto funkci každých 5 minut zavolat, na to používám javaskriptovou funkci SetTimeout
function timeout()
{
setTimeout( "refresh()", 5*60000 ); // get session id every 5 minutes
}
Nakonec si zajistíme, aby se automatické přihlašování vždy spustilo po načtení stránky takto:
<body onload="timeout()">
Nakonec na server uložíme PHP skript reload.php, jež automaticky vygeneruje nové session ID
<?php
// destroy old session
session_start();
$SESSION = $_SESSION;
session_destroy();
// save new session
session_start();
session_regenerate_id();
$_SESSION = $SESSION;
session_write_close();
?>
A nyní můžeme příspěvek psát třeba celou noc a nikdy o něj nepřijdeme. No uznejte není to geniální?
Re: Geniální session v PHP od Anonymous
13.03.2005 #Nevím jak v PHP, ale v ASP.NET je autentizace od session oddělena, a pokud při přihlášení nastavím jeden parametr, uloží se normální cookies s nastavenou expirací, takže k odhlášení nedojde. Přijde mi to jednodušší, než to řešit JavaScriptem na klientovi.
Ostatně, když už na klientovi, není jednodušší udělat IFRAME a v něm META REFRESH?
Re: Geniální session v PHP od markon
13.03.2005 #IFRAMEs v XHTML už neexistují. Navíc nárok na přenosové pásmo je vyšší, protože u IFRAME je potřeba přenášet HTML kód s META TAGem, zatímco u Javascriptu stačí přenášet pouze hlavičky.
Re: Geniální session v PHP od dgx
16.03.2005 #To není koncepční řešení. Web by měl fungovat jako klasická aplikace, a přihlášení zavolat jako "funkci", která se "returnem" vrátí po zadání hesla zase zpět, tedy k rozpracovanému článku.
Tohle není příliš složité na implementaci. Navíc to stačí vyřešit jen jednou a pak používat ve všech aplikacích (a nejen při odhlášení/přihlášení, ale při jakékoliv chybě, která vyvolá jinou stránku a mohla by ztratit původní data)
Re: Geniální session v PHP od Llaik
09.04.2005 #iframe v xhtml existuji, tedy konkretneji v XHTML1.0 Transitional. Ale existuji

jinak reseni je to takove ... balastici. Pokud potrebuji autorizaci, tak si udelam takovou, jaka mi vyhovuje. Neni preci mozne mit vyprseni autorizace nastavene treba na 10minut a obchazet to automatickym volanim skriptu co 5 minut, ktery nedela nic jineho, nez nuluje nejaky "zivotni counter". Nevim, jak bych takoveto reseni popisoval do dokumentace
Re: Geniální session v PHP od tark
17.08.2005 #Já vím, proč používám cookies s životností buď 1 měsíc nebo hodinku (sdílený comp)
Re: Geniální session v PHP od Petr
24.07.2006 #Tohle opravdu docela vychytavka .. ale zaroven podotykam: automaticke odhlasovani tam plni svou funkci. Je to tak mene bezpecne ..
Re: Geniální session v PHP od a
06.03.2008 #a
Re: Geniální session v PHP od Slash
15.04.2008 #Bohužel toto nefunguje v KHTML prohlížečích.