session expirace – skončí po zavření prohlížeče

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
22
Člen | 1478
+
0
-

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>
SyXcz
Člen | 75
+
0
-

pokud vim tak po uzavření prohlížeče je normální se se session zruší… nebo se mílim?

leda kdyby sis to nějak ošetřil pomocí IP a pak nové session přiřadil původní hodnoty… to ale když bude víc lidí na jedné síti tak je na prd… pak leda kdybys použil cookies…

Panda
Člen | 569
+
0
-

Session jsou ovládané pomocí cookies. Začal bych tím, že bych se podíval na dobu expirace cookieska session. Vím, že jsem s tím měl taky trochu problémy, ale pomohlo vymazat starou cookie a nechat si poslat novou.

Ondřej Mirtes
Člen | 1536
+
0
-

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.

22
Člen | 1478
+
0
-

Myslel jsem, že to funguje obdobně jako trvalý přihlášení uživatele, tam se přece cookie řeší v rámci nastavení session, ne? Akorát to potřebuju aplikovat na normalní data, ajko jsou třeba kontaktní adresa uživatele, aby ji při další návštěvě nemusel vypisovat znova…

toka
Člen | 253
+
0
-

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
+
0
-

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

toka
Člen | 253
+
0
-

Session v bootstrap.php:

...
$session = Environment::getSession();
$session->setExpiration('+ 1 year');
$session->start();
...

Zbytek jak máš ty, a na localhostu mi to normálně funguje – po zavření a znovuotevření prohlížeče hodnota counter „přežívá“.

toka
Člen | 253
+
0
-

Funguje v Chrome, Safari, FF, MSIE, Opere, …

22
Člen | 1478
+
0
-

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
+
0
-

Tak v IE8/win7 to jede, ovšem s hláškou:

Notice: Undefined offset: 0 in C:\web\www\test\libs\Nette\loader.php on line 4886

FF 3.6 nefunguje, žádná hláška

Chrome 4.1.2 funguje, žádná hláška…

hmm

Editoval 22 (20. 3. 2010 13:26)

22
Člen | 1478
+
0
-

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
+
0
-

zjistil jsem, že jedinej FF mění ID session po zavření prohlížeče..Kde je chyba? u FireFoxu??

22
Člen | 1478
+
0
-

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
+
0
-

Tak už je to v pořádku…nevim, čím to bylo, ale funguje to…

toka
Člen | 253
+
0
-

Pěkný monolog :-) Možná cache, nebo staré session.

22
Člen | 1478
+
0
-

no ale stejně ten FF nějak pořád blbne..nevadí tomu dvě aplikace na stejné doméně? IE i chrome to zkousne, ale s FF to přidělí nové ID..i když sám vidi expiraci až za rok.

22
Člen | 1478
+
0
-

Kua, tak nakonec pomohl reinstal Firefoxu…

Panda
Člen | 569
+
0
-

Zkoušel jsi smazat cookies? Já osobně si nemyslím, že reinstalace prohlížeče byla nutná.

22
Člen | 1478
+
0
-

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
+
0
-

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.

22
Člen | 1478
+
0
-

no, jsem se na to trochu dival a je to jak rikas Sirgi, ale toto jde prodlouzit normalne pres ini_set a pokud se session nastavi vlastni path, tak by to nemel byt problem. Mozna by to byla dobra feautere pro Nette..