session expirace – skončí po zavření prohlížeče
- 22
- Člen | 1478
mám problém s uchováním hodnot po zavření prohlížeče, ve FF vidím,
že PHPSESSID má dobu správnou, ale data se neobnoví po restartu
prohlížeče a dál jsi nejsem jistý, jestli je dobře předávání a
získávání hodnoty mezi šablonou a presenterem. Jestli jsem to dobře
pochopil, v bootstrapu se nastavuje celá session a jmenný prostory můžu
připojit až v aplikaci.:
bootstrap:
require LIBS_DIR . '/Nette/loader.php';
Debug::enable();
Environment::loadConfig();
$application = Environment::getApplication();
$application->errorPresenter = 'Error';
$session = Environment::getSession();
$session->setExpiration('+ 1 year');
$router = $application->getRouter();
.....
presenter:
class HomepagePresenter extends BasePresenter
{
public function createComponentCookie(){
$form = new AppForm();
$form->addSubmit('test','TEST')->onClick[]=array($this,'Test');
return $form;
}
public function Test(SubmitButton $buttton){
$test = Environment::getSession('test');
$test->setExpiration('+ 14 days');
if(isset($test->counter)){
$test->counter++;
} else {
$test->counter = 1;
}
$this->redirect('this');
}
public function renderDefault()
{
$this->template->message = 'We hope you enjoy this framework!';
$this->template->counter = Environment::getSession('test')->counter;
}
}
šablona:
{block content}
<div id="header">
<h1>It works!</h1>
<h2>Congratulations on your first Nette Framework powered page.</h2>
</div>
<div>
<p>{$message}</p>
</div>
{control cookie}
<div>
Stisknuto: {$counter}
</div>
- Ondřej Mirtes
- Člen | 1536
No podle mě sessions mají platit jen do uzavření prohlížeče. Pokud chceš něco, co bude platit déle, k tomu slouží cookies.
- toka
- Člen | 253
Zmínil jsi trvalé přihlášení, ale na to je lepší cookie
.
Viz např. článek Jakuba Vrány. Ale když chceš nastavit, aby
session
přežila zavření okna prohlížeče, tak je to popsáno
v dokumentaci.
Pokud se neprovede toto nastavení, všechny session proměnné vyexpirují
v momentě zavření okna prohlížeče. Uchování session i po zavření
prohlížeče se hodí například pro dlouhodobé přihlášení
uživatele.
Editoval toka (20. 3. 2010 12:16)
- 22
- Člen | 1478
no cokies jsou nastaveny default takto:
array(5) {
"lifetime" => int(0)
"path" => string(1) "/"
"domain" => string(0) ""
"secure" => bool(FALSE)
"httponly" => bool(FALSE)
}
takže setCookieParams() ? pak teda nechápu, jak to funguje
u přihlašování uživatelů? Možná pletu 2 věci dohromady..jak by to
teda mělo vypadat, aby si kod na začátku stránky pamatoval počet kliků
i po zavření prohlížeče?
https://forum.nette.org/cs/search.php?…
https://forum.nette.org/…dyz-by-nemel
- 22
- Člen | 1478
doplnil jsem start(), ale myslel jsem, že manuálně není potřeba
startovat z článku na zdrojáku…
demo tady: http://server.czskcup.info/…cument_root/
jsem zmaten, help :-)
edit1: nemůže být problém v nastavení php.ini nebo apache?
edit2: navíc mi to vyhazuje: Notice: Undefined offset: 0 in C:\web\www\test\libs\Nette\loader.php on line 4886, což jsem si všiml až v IE
Editoval 22 (20. 3. 2010 12:40)
- 22
- Člen | 1478
tak hlášky
Undefined offset: 0 in C:\web\www\test\libs\Nette\loader.php on line 4886
se podařilo zbavit…kdyz jsem pouzil getIterator(), tak IE8 si pamatovalo
dalši 2 jmenné prostory, ale FF je neviděl, takže pomohlo
destroy()..nechapu..ale FF stale nechce obnocit session po
načtení..nějaký nápad?
- 22
- Člen | 1478
pro zajímavost hlavičky:
Odezva:
Date Sat, 20 Mar 2010 14:07:36 GMT
Server Apache/2.2.15 (Win32) PHP/5.3.2
X-Powered-By Nette Framework
Expires Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma no-cache
Set-Cookie PHPSESSID=9h29bg0150660qj7j0cgj182f7; path=/; HttpOnly PHPSESSID=9h29bg0150660qj7j0cgj182f7; expires=Sun, 20-Mar-2011 14:07:36 GMT; path=/; httponly nette-browser=0.88009166508641; path=/; httponly
Content-Length 1452
Keep-Alive timeout=5, max=100
Connection Keep-Alive
Content-Type text/html
požadavek:
Host server.czskcup.info
User-Agent Mozilla/5.0 (Windows; U; Windows NT 6.1; cs; rv:1.9.2) Gecko/20100115 Firefox/3.6
Accept text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language cs,en-us;q=0.7,en;q=0.3
Accept-Encoding gzip,deflate
Accept-Charset windows-1250,utf-8;q=0.7,*;q=0.7
Keep-Alive 115
Connection keep-alive
Cookie PHPSESSID=0glc3gvq3tsc2mu57hk36puev0
- 22
- Člen | 1478
zkoušel jsem úplně všechno…například to dělalo takový zázraky, že to přetahovalo např. cookies z domény seznam.cz do pracovní domény, pokud se přešlo ze seznamu na projekt, ale je docela možný, že to mohl dělat nějakej plugin, který jsem teď omezil akorát na Firebug a Firecookie..
Editoval 22 (21. 3. 2010 9:22)
- srigi
- Nette Blogger | 558
Chalani zabudate na jednu vec – PHP ma na session „prideleny“ garabage collector, ktory zmaze neaktivnu session (defaultne) po 24min. Proste server ma nejaky pool, kde je su udaje session zviazane s s danym PHPSESSID (ktore chodi cez cookie). A ak 24min dane PHPSESSID nepride, je vsetko z poolu na serveri zmazane (GC sa spusti pri lubovolnom requeste, PHP totiz nebezi trvale).
Takze sa stane cca toto:
- user sa prihlasi, do session mu naukladate udaje
- user chodi po stranke, posiela coockie s PHPSESSID, udaje v poole krasne ostavaju
- user opusti stranku, zavrie proehliadac, cookie prestane chodit
- pride nejaky uplne iny user po 24 min, nastartuje sa PHP engine, a GC skontroluje pool, ci tam nema nejake „mrtve“ session – najde tam udaje toho prveho usera, zisti, ze uz 24min neprisla cookie, tak ich z poolu vyhodi
- vrati sa povodny user a posle aj povodnu cookie s PHPSESSID, ale je mu to plat prdne, lebo server uz udaje aj ID vyhodil z poolu, takze vsetko je stratene
Mozno niekoho napadne zmenit ten interval GC na pozadovanu dobu (mesiac ak potrbujem mesiac?). To je ale uplne nesystemove (nespravne) riesenie, pamatajte na memleaky. Tazkze bud programator prepise session storage handlery alebo naprogramuje logiku, ktora PHPSESSID a udaje ulozi do DB.