Takze sa to da aj zneuzit ;-)
Detekce AJAXových požadavků na serveru
Pokud používáte na klientské straně nějakou javascriptovou knihovnu, jako je třeba jQuery, můžete snadno odlišit, zda požadavek, který přišel na server, je poslán přímo prohlížečem, nebo skriptem. Mnohé knihovny (kromě jQuery třeba i Mootools, YUI či Prototype) totiž přidávají k požadavkům, posílaným přes XMLHttpRequest, speciální hlavičku:
if ( !remote ) {
xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest");
}
Na serveru lze takový požadavek snadno rozpoznat, např. v PHP pomocí podmínky
$_SERVER[ 'HTTP_X_REQUESTED_WITH' ] === 'XMLHttpRequest'
Není tedy třeba přidávat k požadavku nějaké speciální příznaky ( ?ajax=1 apod.)
Zdroj: Detecting Ajax Events on the Server @ Learning jQuery
Dále čtěte…
- Zrychlete svoji webovou aplikaci pomocí Partial Update 5. 10. 2010 9:04
- Web jako API 19. 8. 2010 15:22
- Hledejte na svých stránkách s Google 6. 8. 2010 10:23
- FileAPI & XmlHttpRequest 2 - Práce se soubory v JavaScriptu 5. 7. 2010 11:44
- Webová aplikace pouze s jQuery a CouchDB 5. 5. 2010 9:53
Re: Zaskodnik
celé vláknozneužít? jak můžeš změnou HTTP hlavičky něco zneužít? To bys asi nebyl dobrej programátor, kdyby ses nechat takhle zneužívat :-)
Re: Zaskodnik
celé vláknoPravděpodobně kolega naráží na to, že taková kontrola není jednoznačná a že tuto hlavičku lze podvrhnout – takže např. pokud skript pošle na základě téhle hlavičky nějaké „citlivější informace“ v dobré víře, že je posílá skriptu, tak je to špatně. (Ale to je špatně tak jako tak, bez ohledu na HTTP hlavičky.)
Re: Zaskodnik
celé vláknoCož vystihuje poslední věta předchozí reakce.
Obecně mi ale tento přístup přijde zvláštní – volaný kód by se měl adresovat přímo, nikoli na základě hlaviček…
Re: Zaskodnik
celé vláknoPokud jde o kód, tak samosebou. Ale řekněme, že jde o obsah, třeba stránku, a ten může být načten přímo prohlížečem (pokud AJAX nepodporuje), nebo může být načten nějakým loaderem pomocí AJAX a vložen do DIVu. A podle toho, jakým způsobem je volán, tak je náležitě upraven (pro posílání AJAXem např. nebude zabalen do HTML).
zend
celé vláknoAno, HTTP má i hlavičky :-)
V Zend Frameworku v Controlleru potom staci:
if ($this->_request->isXmlHttpRequest()) {
…
}
Re: zend
celé vláknoAno, HTTP má i hlavičky. A mnoho jich má! A zprávička hovoří zrovínka o jedné z nich, na které se kupodivu dokázali domluvit tvůrci různých JavaScriptových frameworků. ;)
Za doplňující informaci o ZF děkuji.
Re: zend
celé vláknoNebo v Nette Framework stačí
if ($this->isAjax()) {
}
:-))
Re: zend
celé vláknoChybí tu informace o tom, co stačí v Ruby on Rails, v Django, v Javě a v ASP.NET. Snad nějací pozorní čtenáři doplní…
Re: zend
celé vláknoV ASP.NET MVC stačí Request.IsAjaxRequest() ;-)
Btw. je to takovej základ, že nechápu, jak bez téhle znalosti mohl doteď někdo žít. Resp. umím si představit ty (IMHO zbytečné) workaroundy.
Znalost této hlavičky je např. dobrá při nastavení cachingu v ASP.NET, stačí dát varyByHeader…
Btw. tuhle hlavičku používá i Microsoft Ajax Library.
Re: zend
celé vláknoV Djangu stačí HttpRequest.is_ajax() :)
Kešování
celé vláknoPokud chceme výsledek odpovědi kešovat, tak je nutné nastavit HTTP hlavičku Vary.