Detekce AJAXových požadavků na serveru
Nálepky:
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
Takze sa to da aj zneuzit ;-)
zneuží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 :-)
Pravdě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.)
Což 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…
Pokud 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).
Ano, HTTP má i hlavičky :-)
V Zend Frameworku v Controlleru potom staci:
if ($this->_request->isXmlHttpRequest()) {
…
}
Ano, 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.
Nebo v Nette Framework stačí
if ($this->isAjax()) {
}
:-))
Chybí 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í…
V 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.
V Djangu stačí HttpRequest.is_ajax() :)
Pokud chceme výsledek odpovědi kešovat, tak je nutné nastavit HTTP hlavičku Vary.