AJAX request po automatickom odhlaseni

Programovacie jazyky, rady, poradňa...
mastermind
VIP
VIP
Používateľov profilový obrázok
Príspevky: 4810
Registrovaný: 09 feb 2005, 13:17

AJAX request po automatickom odhlaseni

Príspevok od používateľa mastermind »

ahojte.
mam takyto problem a nejako si s nim neviem rady.
mam web na ktorom, je v kazdej podstranke jasne definovane, ktori uzivatelia k nej ma pristup (neprihlaseni, prihlaseni, z konkretnych pouzivatelskych skupin...). Ak si niekto vyziada (klasicky cez http request) stranku ku ktorej nema pristup, vyhodi to error a ma smolu (funkcia message_die).

Problem vsak nastava, ked sa prihlaseny uzivatel dostane na stranku, kde su registrovane xajax funkcie. Po urcitej dobe necinnosti mu vyprsi platnost session a je teda "odhlaseny". Ked vsak potom vyvola xajax funkciu, ta vrati samozrejme html kod stranky s errorom (ten kod, ktory vygeneruje funkcia message_die)
schematicky nejako takto:

Kód: Vybrať všetko

//nedolezity uvod
/..
//update sessions
SessionManager::UpdateSessions();
//..
	
		$module=ModuleManager::GetModule();
		if (!$module->isAuthorized())
			{
				message_die(E_UNAUTHORIZED,"Neoprávnený prístup","Prepáčte, ale k požadovanému modulu nemáte prístup.<br/> Skúste sa prihlásiť, prípadne kontaktujte administrátora");
			}	
		$module->GetContent();
		OutputManager::ShowPage();
ja teda potrebujem funkciu message_die tak, aby vedela ci je dany , request plnohodnotny http request, alebo je to request xajaxu. Ak by som vedel toto zistit, vedel by som vygenerovat prislusnu chybu (html, alebo xajaxResponse)
moja otazka teda znie, viem nejako zistit, ci je to xajax alebo http request?
snad ste ma pochopili a uz vopred dakujem za rady
chrono
VIP
VIP
Používateľov profilový obrázok
Príspevky: 7127
Registrovaný: 25 dec 2006, 15:17

Príspevok od používateľa chrono »

Browser generuje tie žiadosti identické, takže tam budeš musieť pridať niečo ty. Buď budeš volať cez ajax nejaký iný php skript ako pre ne-ajax volania, alebo do url pre ajax pridáš nejaký identifikátor (napr. script.php?ajax=true).
mastermind
VIP
VIP
Používateľov profilový obrázok
Príspevky: 4810
Registrovaný: 09 feb 2005, 13:17

Príspevok od používateľa mastermind »

no identicke az tak nie su. porovnal som hlavicky http a ajax requestu a nasiel som tam nejake rozdiely. no nic take podla ktorych by som vedel identifikovat povodcu.
tak som si upravil kniznicu xajax a pridal som tam vlastnu hlavicku REQUESTOR. vo FF a opere to funguje jedna basen, no IE (ako inac...) s tym ma problem. Takze teraz uz len musim prist na sposob akym pridat vlastnu hlavicku aj do IEcka a mam pokoj...
takze ak by boli nejake napady, som otvoreny :)
chrono
VIP
VIP
Používateľov profilový obrázok
Príspevky: 7127
Registrovaný: 25 dec 2006, 15:17

Príspevok od používateľa chrono »

Ako tam pridávaš hlavičku? Používaš setRequestHeader() (lebo to by malo fungovať aj podľa návodov, čo som videl na stránkach MS)? Používaš GET alebo POST? (v IE si skúšal aj to opačné, či to nemá napr. obmedzenie, že hlavičku posiala iba pri POST).

Práve som na internete našiel toto: setRequestHeader Vyzerá to tak, že tá funkcia je iba v IE7+
http://msdn2.microsoft.com/en-us/library/aa741337.aspx

Takže to asi budeš musieť urobiť cez to pridanie query do url.

To, či sú tie žiadosti rovnaké záleží od prehliadača. Nie je na to nijaká norma (aspoň pokiaľ viem). Napr. Konqueror posiela tie hlavičky rovnaké (a aj FF).
roman3x
Medium Star
Medium Star
Používateľov profilový obrázok
Príspevky: 448
Registrovaný: 02 nov 2005, 18:30
Kontaktovať používateľa:

Príspevok od používateľa roman3x »

preco nechces pouzit script.php?ajax=true ? babrat sa s hlavickami...kde sa moze od verzie k verzii prehliadaca nieco zmenit ... viem o chybe v hlavickach, co FF zozerie a ine nie a o dalsej, co FF na wine zozerie, ale na linuxe uz nie....
mastermind
VIP
VIP
Používateľov profilový obrázok
Príspevky: 4810
Registrovaný: 09 feb 2005, 13:17

Príspevok od používateľa mastermind »

ak dobre chapem, tak chcete aby som pri registrovani php funkcii pre xajax, pouzil externy skript spolu s parametrom. tak? Ak to chapem dobre tak musim povedat: V ziadnom pripade. :) dovod je prozaicky. Cely web je pisany s OOP pristupom. Xajax funkcie pristupne v konkretnom module (triede) su definovane priamo v danom module (triede). Takto je vdaka enkapsulacii OOP zabezpecena autentifikacia aj pri xajax requestoch. Teda ak by po mne upravoval kod nejaky lame programer, nemoze to podrbat.

Pouzivam vyhradne POST metodu, takze rozdielne hlavicky pri roznych metodach requestu ma netrapia.

Ak vam napada sposob akym to vyriesit a zaroven nepokazit OOP koncept... pokojne napiste budem rad :)

to chrono: ano hlavicku som pridal presne tak ako si napisal. No v IE 6 to nefunguje. Presne tak ako si napisal :) No uz som si zvykol, ze polovicu casu vyvoja aplikacie stravim upravovanim to pre IE
chrono
VIP
VIP
Používateľov profilový obrázok
Príspevky: 7127
Registrovaný: 25 dec 2006, 15:17

Príspevok od používateľa chrono »

Nemôžeš predať parameter cez GET alebo POST (napr. to ajax=true)? Ako by to ovplyvnilo celý skript? Veď by si tam pridal iba niečo ako $ajax = isset($_GET['ajax']); alebo to iste pre POST.

Normalne sa bude volať: http://www.web.xxx/page.php. Ajax zavolá xmlHttp.open("POST","http://www.web.xxx/page.php?ajax=true",true); alebo to sa ajax=true vloží medzi ostatné veci v POST do xmlHttp.send($text) (teda sa to spracuje tým istým php skriptom).

Keďže v IE6- nefunguje modifikovanie http hlavičky, tak je jediný spôsob ako povedať skriptu, že to ide od JS, je poslať nejakú premennú cez GET/POST (alebo na spracovanie použiť iný skript).
mastermind
VIP
VIP
Používateľov profilový obrázok
Príspevky: 4810
Registrovaný: 09 feb 2005, 13:17

Príspevok od používateľa mastermind »

prave som sa tak pozeral na to nechutne mnozstvo javascriptu a doslo mi to... S tymi hlavickami som sa od zaciatku vybral nespravnou cestou... :oops:

no ked tak nad tym uvazujem... Ked to urobim takto, uplne si znicim error handling v pripade, ze si uzivatel takyto parameter dopise :?
chrono
VIP
VIP
Používateľov profilový obrázok
Príspevky: 7127
Registrovaný: 25 dec 2006, 15:17

Príspevok od používateľa chrono »

Myslíš, keď si ho dopíše do url? Veď ho môžeš poslať ako POST (ale aj to môže nasimulovať). A aj keď by sa to poslalo v hlavičke aj vtedy sa to dá nasimulovať (a to isté platí aj pre cookie).

Ak prídeš na to, ako takéto a podobné problémy jednoducho riešiť, daj vedieť (alebo ešte lepšie, daj si to patentovať). :)
mastermind
VIP
VIP
Používateľov profilový obrázok
Príspevky: 4810
Registrovaný: 09 feb 2005, 13:17

Príspevok od používateľa mastermind »

chrono napísal:Myslíš, keď si ho dopíše do url? Veď ho môžeš poslať ako POST (ale aj to môže nasimulovať). A aj keď by sa to poslalo v hlavičke aj vtedy sa to dá nasimulovať (a to isté platí aj pre cookie).

Ak prídeš na to, ako takéto a podobné problémy jednoducho riešiť, daj vedieť (alebo ešte lepšie, daj si to patentovať). :)
dik za radu. urcite dam vediet a mozno si to aj patentujem. Este neviem v akom poradi to urobim. :)
Musi sa to nejako dat. Ja sa nemozem zmierit s tym ze moj kod je deravy :(

co uz. pridal som tam GET parameter, pri ajax requeste. A ide to. a nakoniec som jednoducho vyriesil aj ten, error handling. Nie je to sice 100% riesenie, ale aj 99% je dost :)

dakujem vam obom pani za pomoc. Este taka otazka na zaver. Ktoru AJAX kniznicu pouzivate s PHPckom?
chrono
VIP
VIP
Používateľov profilový obrázok
Príspevky: 7127
Registrovaný: 25 dec 2006, 15:17

Príspevok od používateľa chrono »

Na internete som robil malí prieskum ohladne podpory funkcie setRequestHeader() v IE. Som dosť zmetení, keďže na stránkach MS je tá funkcia uvedená medzi novinkami verzie 7 (What's New in Internet Explorer 7). Zároveň som na ich stránkach našiel problémy starších verzií v ktorých napr. odporúčali tú funkciu použiť (napr. IE pri GET požiadavke môže použiť súbor z cache a obísť sa to dá poslaním no-cache v hlavičke) alebo nejaké zraniteľnosti súvisiace s tou funkciou.

Jediný overený fakt je ten, že Opera tú funkciu má až od verzie 8.01

Zaujímavé veci pre Ajax+Php sa dajú nájsť tu ajaxian.com. Čo sa mi celkom páči je Symphony (vlastne zaujímavých vecí [aj frameworkov] tam je viac)
roman3x
Medium Star
Medium Star
Používateľov profilový obrázok
Príspevky: 448
Registrovaný: 02 nov 2005, 18:30
Kontaktovať používateľa:

Príspevok od používateľa roman3x »

videl som ich asi 30, zaujali ma 2:
sajax - fajna mala kniznicka, ma 5 zakladnych funkcii, k stranke ti prida 5kb JS kodu, ak cches nieco viac, nema vyznam sa s nou zatazovat a pouzi dalsiu
xajax - ma vsetko :D , k stranke prida tusim 14kb JS kodu.
este som videl jednu, ktoru som chcel otestovat, ale nazov si nepametam. kludne ale mozu existovat lepsie...len som nenadabil.
osobne nemam rad ani len pohlad na prplacku s vlastnou tvorbou ajaxu :oops:
final
Light Star
Light Star
Používateľov profilový obrázok
Príspevky: 206
Registrovaný: 04 dec 2005, 11:43
Bydlisko: Prievidza

Príspevok od používateľa final »

myslím, že by bolo lepšie posielať tú "identifikačnú" premennú v poste (ako chrono navrhoval), keďže ako si spomenul, viacmenej používaš post spôsob... predsa už dotyčný bude mať viac práce ako len pospájať premenné dokopy.. a dať to do browsera..

na toto ani spôsob snaď neni, ide v podstate len o to, ako to takým ľuďom chceš sťažiť.. ja také veci beriem väčšinou z hľadiska, že či ma niekto bude kritizovať za to ako som to spravil - či si bude myslieť, že je to neprofesionálen riešenie a tak, ale či už tam šupneš _GET, alebo podobné, nevidím v tom nič zlé...

k tomu setRequestHeader, neviem aké ste testovali hlavičky, ale IE akosi eviduje ktoré hlavičky nastaví, ktoré nie - aspoň teda v 6tke.. takže pokiaľ tam dáš niečo v štýle..

http.setRequestHeader('x-referer', 'som ajax');

mohlo by to fungovať.. neviem ako sa tvária ďalšie prehliadače - nemám teraz možnosť testovať..

( snaď som všetko pochopil správne )

k tým knižniciam, ja osobne nepoužívam žiadne (využívam ajax na nevyhnutných miestach) a mám to radšej po svojom - keď sa na to pozriem a viem čo je čo .)
chrono
VIP
VIP
Používateľov profilový obrázok
Príspevky: 7127
Registrovaný: 25 dec 2006, 15:17

Príspevok od používateľa chrono »

Na sťaženie by sa možno dali použiť cookies. Server by vždy poslal koláčik "ajax=false". Ajax by najskôr nastavil pomocou JS ten koláčik na "ajax=true" a potom by odoslal požiadavku (ale netestoval som to, takže neviem, či by to fungovalo). V podstate je jedno, ako sa to pošle (v php skripte sa zmení len $_GET na niečo iné).

Každý normálny prehliadač pridá do http hlavičky čokoľvek, čo tam pridáš pomocou funkcie setRequestHeader. IE pravdepodobne má/malo tú funkciu nejako obmedzenú. Ako som už písal, tá funkcia je napísaná medzi novinkami v IE 7 (aj keď to vyzerá tak, tá funkcia už bola aj v starších verziách). Nikde sa mi nepodarilo nájsť, čo presne IE v ktorej verzii podporuje (a či to má nejaké obmedzenia).
Napísať odpoveď