Autor | Zpráva | ||
---|---|---|---|
axanet Profil * |
#1 · Zasláno: 26. 5. 2011, 01:02:00
Ahoj. Řeším problém aktualizace stránky pomocí ajaxu resp. způsobu předávání dat. Dejme tomu že mám stránku na které je tabulka. Pokud kliknu na řádek tabulky, chci aby se smazal - jistě je blbost načítat kvůli tomu znovu celou tabulku (zvlášť pokud by bylo její generování nějak náročné). Proto by bylo dobré zavolat jen příkaz smazRadek a zjistit jeho výsledek a na základě toho javascriptem ten řádek tabulky smazat. Jak takové informace ale předávat? Normálně jako plaintext bez tagů nebo v nějaké struktuře xml nebo jak se tohle vlastně v praxi řeší?
|
||
_es Profil |
#2 · Zasláno: 26. 5. 2011, 01:15:13
axanet:
„Jak takové informace ale předávat?“ Ľubovoľne, podľa vlastnej fantázie, ešte sa okrem spôsobov, čo si vymenoval, môže použiť napríklad aj JSON. |
||
joe Profil |
#3 · Zasláno: 26. 5. 2011, 01:28:28 · Upravil/a: joe
Nejlepší řešení bude asi JSON, XML je zvytečně moc roztahané (objemné, i když u takové věci to je prakticky jedno).
A pak můžeš vracet JSON data ve formátu: { 'status' : 'fail', 'message' : 'Nastala chyba ...' } |
||
axanet Profil * |
#4 · Zasláno: 26. 5. 2011, 01:41:10
A jakým způsobem se odstiňuje uživatel od komunikace prohlížeč(js) vs. server(php)? Řeší se to nějak aby uživatel nemohl sám zadat url a data posílané ajaxem nebo se to jenom "schová".
|
||
Medvídek Profil |
#5 · Zasláno: 26. 5. 2011, 09:42:37
axanet:
Vždycky to musíš mít ošetřený, protože i když se to posílá AJAXem, tak není problém tu url vyčíst. |
||
joe Profil |
#6 · Zasláno: 26. 5. 2011, 12:20:28
Medvídek:
„Vždycky to musíš mít ošetřený“ Můžeš to rozvést, prosím? |
||
Medvídek Profil |
#7 · Zasláno: 26. 5. 2011, 12:32:40
joe:
No na straně toho skriptu. Pokud se má něco odmazávat, tak na straně kriptu zajistit, aby to mohl odmazávat ten, kdo na to má práva. (Třeba přes SESSION). |
||
joe Profil |
#8 · Zasláno: 26. 5. 2011, 15:59:45
Medvídek:
Nevím jestli to bylo přesně to, na co se axanet ptal. Myslím, že mu šlo spíše o to, aby mohl z JavaScriptu volat nějakou URL, ale po zadání URL adresy (té samé jako v JS) přímo do adresního řádku se neprovedlo nic. axanet: K tomu se používá HTTP hlavička X-Requested-With, podle které poznáš, zda jde o AJAX požadavek nebo ne. |
||
Chamurappi Profil |
#9 · Zasláno: 26. 5. 2011, 16:41:01
Reaguji na joa:
Jak přistupují k takové hlavičce proxy servery? Podporují ji běžně? |
||
joe Profil |
#10 · Zasláno: 26. 5. 2011, 18:00:20
Chamurappi:
Vím jen, že se to tak používá. Jestli s tím je nějaký problém, pokud je přístup přes proxy, jsem se nezajímal. Možná bys to mohl napsat, když to určitě víš a jen mě zkoušíš :-) |
||
Chamurappi Profil |
#11 · Zasláno: 26. 5. 2011, 18:07:28
Reaguji na joa:
Nevím. Ale problém bych očekával, protože třeba zrovna proxy server, za kterým se docela často nacházím, je schopen nakešovat prakticky cokoliv. Takže očekávám, že dostanu i zdroj načtený původně s nějakou nestandardní hlavičkou, pokud si stejnou adresu zadám normálně do prohlížeče. |
||
joe Profil |
#12 · Zasláno: 26. 5. 2011, 18:35:10
Chamurappi:
Tak to jsem špatně odhadnul. Už rozumím, na co narážíš, zkusil jsem něco najít a skoro žádné problémy jsem s tím nenašel. Takže pokud je stejná adresa pro AJAX (řekněme, že vrací nějaká JSON data) a non-AJAX požadavek a kontroluje se pouze ta hlavička X-Requested-With a ty napřed uděláš ten AJAX požadavek a pak si tu samou adresu otevřeš do nového okna, dostaneš JSON data? :-) A nezabírají ani hlavičky, které mají cache vypnout? V komentářích článku detekování AJAXu, píše Jason (on August 2, 2009 @ 5:58 pm), že ani hlavičky pro cache nemusí jít. Tak pak by mělo stačit při každém AJAX požadavku přidat do URL nějaký čas, ne? Ale zatím jsem nikde neviděl, že by s tím měl někdo problém a něco takového dělal, protože pak se připravuje o cache, i když někdy to je žádoucí. |
||
axanet Profil * |
#13 · Zasláno: 26. 5. 2011, 19:17:01
Takže se v praxi nakonec používá něco jako http://server.cz/index.php?cil=tabulka&akce=smazat&radek=10&ajak=ano ? Marně jsem se totiž zkoušel některými "ajaxovými projekty" prokousat - jsou moc komplikované a nevidím to v tom.
|
||
joe Profil |
#14 · Zasláno: 26. 5. 2011, 19:36:48 · Upravil/a: joe
axanet:
Pokud měl být poslední parametr &ajax=ano, tak ne. Celkem dobře napsané to je tady, jen tam ještě chybí hlavičky HTTP požadavku. Po tomto řádku httpRequest.open("GET", stranka, true); je třeba ještě přidat httpRequest.setRequestHeader('X-Requested-With', 'XMLHttpRequest'); a další případné potřebné hlavičky. Adresa by tedy zůstala: http://server.cz/index.php?cil=tabulka&akce=smazat&radek=10 A v PHP by jsi zjistil, jestli se jedná o AJAX požadavek: if(!empty($_SERVER['HTTP_X_REQUESTED_WITH']) && $_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest') { // AJAX } |
||
_es Profil |
#15 · Zasláno: 26. 5. 2011, 19:44:46
Ak sa niečo maže, tak by to principiálne malo byť nie cez metódu GET, ale cez metódu POST.
|
||
pcmanik Profil |
#16 · Zasláno: 26. 5. 2011, 20:34:00
_es:
Preco? Ved ked predavas premennu v adrese, mas zbytocne pouzivat post, nakolko sa vacsinou predava len id. |
||
_es Profil |
#17 · Zasláno: 26. 5. 2011, 20:55:20
pcmanik:
„Preco?“ Jedným z dôvodov je napríklad zabránenie postupu v [#4] axanet. A nemusí ísť len o zabránenie tomu, aby na zmazanie dát stačila požiadavka na načítanie súboru. Adresa s GET parametrami je aj rôznymi strojmi považovaná za „neškodnú“, nič nemeniacu, adresu a preto by pri nesplnení tohoto predpokladu mohlo nastávať neočakávané mazanie dát z databáze. |
||
joe Profil |
#18 · Zasláno: 26. 5. 2011, 21:26:47
_es:
Pokud dáš adresu do prohlížeče, tak ji asi neodešleš s hlavičkou HTTP_X_REQUESTED_WITH, ne? Pokud děláš administraci, akce smazání (například článků) řešíš přes POST? Zatím jsem se v takovém případě s POST metodou snad ani nesetkal, jen s pouhým odkazem, doplněným o token. |
||
_es Profil |
#19 · Zasláno: 26. 5. 2011, 21:54:10
joe:
„Pokud dáš adresu do prohlížeče, tak ji asi neodešleš s hlavičkou HTTP_X_REQUESTED_WITH, ne?“ Myslím, že Chamurappi sa v [#11] snažil naznačiť, že by k tomu dôjsť mohlo a nemusí ísť len o požiadavku zaslanú prehliadačom. Navyše je potom odoslanie cez GET náročnejšie o pridanie tej hlavičky a jej kontrolu. A aj menej bezpečné - hocikto s prístupom len k logu vyžiadaných adries môže potom ľubovoľne mazať dáta. |
||
pcmanik Profil |
#20 · Zasláno: 26. 5. 2011, 22:14:38
_es:
Je celkom logicke, ze na servery si overis aspon ci je uzivatel prihlaseny a ma pravo mazat tie veci, to iste plati aj u postu, takze tym sa nic neriesi a len blazon by sa spoliehal na to ze post je bezpecnejsi. Metoda Post je rovnako nebezpecna, mozes menit obsah jej obsah, takze to nic neriesi, a naviac GET je menej narocny na vykon ako POST. Jednoducho pre male data je tu GET pre velke je tu POST. |
||
axanet Profil * |
#21 · Zasláno: 26. 5. 2011, 22:34:37
Také používám pro mazání GET - zatím tedy bez ajaxu, ale je to rychlejší vygenerovat 1000 odkazů než 1000 formulářů nebo než použivat jen javascript. Tu hlavičku HTTP_X_REQUESTED_WITH bych nerad použil, pokud je nějaká možnost že by to proxy nepodporovala (jak bylo uvedeno výše).
|
||
joe Profil |
#22 · Zasláno: 26. 5. 2011, 23:05:11 · Upravil/a: joe
_es:
„Myslím, že Chamurappi sa v [#11] snažil naznačiť ...“ Řekl bych, že přidáním nějaké proměnné s časem tento problém řeší, navíc tuto hlavičku používají i různé frameworky a nikdo si zatím neztěžoval. „Navyše je potom odoslanie cez GET náročnejšie o pridanie tej hlavičky a jej kontrolu.“ To není o moc náročnější, jak jinak bys chtěl rozeznávat AJAX požadavky..? „A aj menej bezpečné - hocikto s prístupom len k logu vyžiadaných adries môže potom ľubovoľne mazať dáta.“ Je samozřejmé, že se kontroluje SESSION na serveru, zda k tomu jsou práva. Je to použité i v Nette Frameworku - isAjax() |
||
Časová prodleva: 13 let
|
0