|
[Grafika]
[WebTip]
[Fotografování]
[Galerie]
[MujMac]
[Printing]
|
|||||||||
![]() |
||||||||||
|
|
|||||||||
Diskuzní forum: JavaTéma diskuze: Programovací jazyk Java. Pro javascript existuje vlastní diskuzní forum.Tip: nemáte rádi v textu smajlíky? Ruší vaše zdrojové kody? Vypněte si je! (Moje nastavení / Nastavení soukromí) Jak zamezit nechtěnému vícenásobnému předání dat z formuláře?
Vloženo uživatelem: Keilew - uživatel již zaslal 88 příspěvků (IP uloženo)
Datum: 15. 09. 2006 14:05
Ahoj lidi, jak co nejjednodušeji ošetřit toto:
Stránka xxx.jsp obsahuje formulář. Uživatel vyplní, akce xxx.jsp, metoda POST, hlídám si hned na začátku, zda čudlík SUBMIT "ano" nebo "ne" (tím rozhoduju, zda zpracuju data a zobrazím formulář, nebo jen zobrazím formulář). Uživateli napíšu - vaše data byla zpracována a pokračuju dál zobrazením formuláře. Jsem stále na xxx.jsp, bohužel mám stále v REQUEST ten "zmáčknutej čudlík", takže když uživatel zmáčkne F5, zpracuju data znova, ale to je už nežádoucí. Řešením je určitě nějaký JavaScript a přesměrovat ho znovu na sebesama, čímž se ztratí platnost REQUESTU. Ale nejde to jinak a lépe a přitom stejně jednoduše? Možná celý problém tkví v tom, že mám guláš ve všech těch "forwardech", který JSP nabízí... Jedny jsou bezpečný, druhý nebezpečný... ![]() Re: Jak zamezit nechtěnému vícenásobnému předání dat z formuláře?
Vloženo uživatelem: Maaartin - uživatel již zaslal 10535 příspěvků (IP uloženo)
Datum: 15. 09. 2006 15:14
vidim, ze nikdo nepise, toz zopakuju svuj prispoevek z predchoziho vlakna:
velmi zjednodusene receno: ja mam z requestu nejakou SortedMap<String, String> a z ni beru hashCode() ten vkladam do tabulky, kde je jako UNIQUE. kdyz je stejny tak dojde k chybe - tzn opakovany request odchytim. ve skutecnosti: tohle pouzivam jen u requestu ktere neco meni. hashCode ma jen 32 bitu, nastavaly by kolize, pouzivam md5, tam je kolize velmi nepravdepodobna. komu to nestaci, at vezme SHA-1,... az SHA-512. komu ani to nestaci at jde delat neco jinyho (je to vul a nemel by programovat). z ty tabulku mazu stary zaznamy. na dovrseni: delam to v pachcalu. Re: Jak zamezit nechtěnému vícenásobnému předání dat z formuláře?
Vloženo uživatelem: mr.stepka - uživatel již zaslal 171 příspěvků (IP uloženo)
Datum: 15. 09. 2006 15:46
> bohužel mám stále v REQUEST ten "zmáčknutej čudlík", takže když uživatel zmáčkne F5, zpracuju data znova
Podle popisu hádám, že na jedné JSP současně zobrazujete formulář a také zapisujete data do databáze?! Vytvořte si servlet, který bude zpracovávat příchozí požadavek z JSP stránky (s formulářem). V servletu data načtete z requestu, můžete provést validaci, a uložíte do databáze. Po zpracování přepošlete požadavek na stránku, kterou chcete zobrazit uživateli (sendRedirect, pokud použijete forward, tak jste tam kde jste teď). Samozřejmě můžete použít i nějakou kontrolu v session proměnné (např. hash). V každém případě to bude rychlejší a efektivnější než zjišťovat, jestli jsou data v databázi UNIQUE. Štěpán, HK Re: Jak zamezit nechtěnému vícenásobnému předání dat z formuláře?
Vloženo uživatelem: Keilew - uživatel již zaslal 88 příspěvků (IP uloženo)
Datum: 15. 09. 2006 16:12
> Po zpracování přepošlete požadavek na stránku, kterou chcete zobrazit uživateli (sendRedirect, pokud použijete forward, tak jste tam kde jste teď).
Cituji z knihy JSP - Java Server Pages - podrobný průvodce pro začínajícího tvůrce od Garyho Bollingera: "Přesměrování tohoto typu (response.sendRedirect a response.sendError)" by se měla používat opatrně a pouze za nenormálních (chybových) podmínek. Ptám se, nevíte proč? Re: Jak zamezit nechtěnému vícenásobnému předání dat z formuláře?
Vloženo uživatelem: mr.stepka - uživatel již zaslal 171 příspěvků (IP uloženo)
Datum: 15. 09. 2006 16:17
Přesměrování je o něco pomalejší než přeposlání (forward), protože při přeposlání dochází ke zpracování pouze na straně serveru. Pokud použijete přesměřování, tak server odešle požadavek klientovi, který ji hned vrátí - tím se změní adresa v prohlížeči.
Forward používá většina frameworků (např. Struts), ale pro tento případ opakovaného zápisu je jednodušší použít redirect. Chcete-li využít forward, musíte použít pro kontrolu session proměnnou. Štěpán, HK Re: Jak zamezit nechtenemu vicenasobnemu predani dat z formulare?
Vloženo uživatelem: romanp - uživatel již zaslal 91 příspěvků (IP uloženo)
Datum: 15. 09. 2006 16:18
>> bohužel mám stále v REQUEST ten "zmáčknutej čudlík", takže když uživatel zmáčkne F5, zpracuju data znova > > Podle popisu hádám, že na jedné JSP současně zobrazujete formulář a také zapisujete data do databáze?! Vytvořte si servlet, který bude zpracovávat příchozí požadavek z JSP stránky (s formulářem). V servletu data načtete z requestu, můžete provést validaci, a uložíte do databáze. Po zpracování přepošlete požadavek na stránku, kterou chcete zobrazit uživateli (sendRedirect, pokud použijete forward, tak jste tam kde jste teď). taky bych se priklanel k tomuto reseni, nekdy ho nekdo nazval "navrhovym vzorem" POST-REDIRECT-GET. Velice pekne je to popsano v nasledujici clanku Redirect After Post http://www.theserverside.com/tt/articles/article.tss?l=RedirectAfterPost -- S pozdravem Roman "Dagi" Pichlik /* http://www.sweb.cz/pichlik/ Blog pro kodery */ Příspěvek zaslán emailem Re: Jak zamezit nechtenemu vicenasobnemu predani dat z formulare?
Vloženo uživatelem: romanp - uživatel již zaslal 91 příspěvků (IP uloženo)
Datum: 15. 09. 2006 16:29
> > Po zpracování přepošlete požadavek na stránku, kterou chcete zobrazit uživateli (sendRedirect, pokud použijete forward, tak jste tam kde jste teď). > Cituji z knihy JSP - Java Server Pages - podrobný průvodce pro začínajícího tvůrce od Garyho Bollingera: "Přesměrování tohoto typu (response.sendRedirect a response.sendError)" by se měla používat opatrně a pouze za nenormálních (chybových) podmínek. > Ptám se, nevíte proč? treba to je jenom nejaka poucka, ktera se zachovala z historickeho hlediska. Tuto metodu bezne vyuzivaji vsechny MVC frameworky. -- S pozdravem Roman "Dagi" Pichlik /* http://www.sweb.cz/pichlik/ Blog pro kodery */ Příspěvek zaslán emailem Re: Jak zamezit nechtěnému vícenásobnému předání dat z formuláře?
Vloženo uživatelem: Maaartin - uživatel již zaslal 10535 příspěvků (IP uloženo)
Datum: 15. 09. 2006 16:36
se vsemi prispevky souhlasim, jen mi neni jasny jestli tazatel vi na co se pta....
na jedny strane se tu resi redirekt a forward, v dotazu ale tez stoji > takže když uživatel zmáčkne F5, zpracuju data znova, ale to je už nežádoucí. coz je trivialne vyreseno tim hashovanim - ten POST-REDIRECT-GET je uz trochu vyssi divci. Re: Jak zamezit nechtenemu vicenasobnemu predani dat z formulare?
Vloženo uživatelem: romanp - uživatel již zaslal 91 příspěvků (IP uloženo)
Datum: 15. 09. 2006 16:39
> treba to je jenom nejaka poucka, ktera se zachovala z historickeho > hlediska. Tuto metodu bezne vyuzivaji vsechny MVC frameworky. forward myslim, ten redirect se chova tak jak popisuje mr.stepka -- S pozdravem Roman "Dagi" Pichlik /* http://www.sweb.cz/pichlik/ Blog pro kodery */ Příspěvek zaslán emailem Re: Jak zamezit nechtěnému vícenásobnému předání dat z formuláře?
Vloženo uživatelem: mr.stepka - uživatel již zaslal 171 příspěvků (IP uloženo)
Datum: 15. 09. 2006 16:46
> coz je trivialne vyreseno tim hashovanim - ten POST-REDIRECT-GET je uz trochu vyssi divci
Nejelegantnější řešení je POST-REDIRECT-GET (díky Dagi, tohle pojmenování jsem neznal). Přijde mi jednodušší provádět přesměrování než ověřovat nějaký hash v databázi (a když už, tak uložit do session - ušetříte si zbytečný dotaz). Když někdo použije hash, tak je vhodné vložit třeba i timestamp... protože některé vstupy se mohou opakovat, výsledkem čehož je stejný hash - např. diskuse, kde někdo odpovídá "ok", "díky!", "lol" apod. Myslím si, že z výše uvedeného řešení je všechno zřejmé ![]() Štěpán, HK Re: Jak zamezit nechtěnému vícenásobnému předání dat z formuláře?
Vloženo uživatelem: Maaartin - uživatel již zaslal 10535 příspěvků (IP uloženo)
Datum: 15. 09. 2006 17:25
> řijde mi jednodušší provádět přesměrování než ověřovat nějaký hash v databázi (a když už, tak uložit do session - ušetříte si zbytečný dotaz).
samozrejme.... ja psal o tom, ze tohle delam v pachcalu, ten timestamp tam nemam, ale neco co ho zastupuje jo. nepochybuju o tom, ze POST-REDIRECT-GET je namakany - ale JEDNODUCHY to teda neni (aspon pro me na pochopeni ne). Re: Jak zamezit nechtěnému vícenásobnému předání dat z formuláře?
Vloženo uživatelem: emis - uživatel již zaslal 248 příspěvků (IP uloženo)
Datum: 15. 09. 2006 17:41
Já doporučuji použít SESSION, protože se může stát, že se stránka načítá pomalu a uživatel klepne na tlačítko dvakrát a vícekrát. I když to se dá případně řešit Javascriptem. Re: Jak zamezit nechtěnému vícenásobnému předání dat z formuláře?
Vloženo uživatelem: Keilew - uživatel již zaslal 88 příspěvků (IP uloženo)
Datum: 16. 09. 2006 11:33
S tímto řešením jsem v rozsahu svého požadavku spokojen: http://keilewnet.jsp4u.net/pokus/start.jsp. Není možná na první pohled zcela patrné, že data zpracovává skriptlet, protože s nima nic nedělá
POST-REDIRECT-GET musím nejdřív nastudovat. Děkuju! ![]() Toto fórum je provozováno také jako emailová konference s e-mailovou adresou java [a] builder.cz. Toto je neredigovaná a nemoderovaná diskuse čtenářů serveru Builder.cz. Redakce ani provozovatel serveru za obsah jednotlivých příspěvků nenese zodpovědnost. |