Záhada s Uploadify a sessions – error 303
- danielseek
- Člen | 42
Dobrý den, téma tady bylo už jednou diskutováno: https://forum.nette.org/…fy-chyba-303
Pro Uploadify mám vytvořenou komponentu, která je připojená do Presenteru, který vyžaduje, aby byl uživatel přihlášený (SESSION). Problém je, že uploadify používá FLASH, tudíž se SESSION Id změní a nelze použít akci komponenty, protože v této session není uživatel přihlášený.
Věc jsem vyřešil tak, že do index.php jsem přidal (Kvůli nové verzi uploadify se moje řešení liší od toho, které je prezentováno v tématu výše):
//index.php
if (isset($_POST['imgUpSID'])) {
session_id($_POST['imgUpSID']);
}
//při nastavování uploadify pomocí javascriptu pak nastavím formData
'formData': {imgUpSID : {session_id()}}
Řešení funguje. Bohužel ale jen v administraci (AdminModule). Ve FrontModule mi to stále házi e303 a dokonce mi to zruší SESSION úplně a musím se přihlásit znovu. Nechápu jaký rozdíl je mezi těmito dvěma moduly.
Edit:
Tak jsem si zkoušel zjistit co se vlastně stane se session když kliknu na
upload.
Zjistil jsem, že nette si pravděpodobně myslí, že uživatel zavřel
prohlížeč a odhlásí ho (reason 4). Zvláštní je, že v session zůstane
cely objekt s identitou uživatele.
[authenticated] => 1
[identity] => Nette\Security\Identity Object
(
[id:Nette\Security\Identity:private] => 45
[roles:Nette\Security\Identity:private] => Array(Zůstavá stejný...)
[data:Nette\Security\Identity:private] => Array (Zůstavá stejný...)
[frozen:Nette\FreezableObject:private] =>
)
[reason] =>
[authTime] => 1386530379
[expireTime] => 1386531580
[expireDelta] => 1200
[expireIdentity] =>
[expireBrowser] => 1
[browserCheck] => 1
Se změní na
[authenticated] => 0
[identity] => Nette\Security\Identity Object
(
[id:Nette\Security\Identity:private] => 45
[roles:Nette\Security\Identity:private] => Array(Zůstavá stejný...)
[data:Nette\Security\Identity:private] => Array (Zůstavá stejný...)
[frozen:Nette\FreezableObject:private] =>
)
[reason] => 4
přibyde také
[Nette.Application.Flash/n9yc] => Array
(
[flash] => Array
(
[0] => stdClass Object
(
[message] => Access denied
[type] => info
)
)
)
Editoval danielseek (8. 12. 2013 22:43)
- danielseek
- Člen | 42
Tak už jsem na to přišel, nette mě úplně zcela jednoduše odhlašoval. Když je ukončena komunikace v rámci Flash, nette to chápe jako, že se uživatel zavřel okno prohlížeče a proto mne odhlásí. To, že IdentityObject zůstavá v session je běžné defaultní chování.
Rozdíl mezi AdminModule a FrontModule spočíval, v tom, že admin měl z nějakého důvodu nastaveno, aby uživatele neodhlásil, potom co zavře okno prohlížeče.
Dá se to nějak obejít, aniž bych úplně vyloučil možnost odhlášení uživatele když skutečně zavře okno prohlížeče?