[Grafika] [WebTip] [Fotografování] [Galerie] [MujMac] [Printing]
  Redakce: info@builder.cz   Inzerce: reklama@grafika.cz

 Diskuzní forum: Java

Té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ý... confused smiley

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é thumbs up

Š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á grinning smiley
POST-REDIRECT-GET musím nejdřív nastudovat. Děkuju! winking smiley



Vaše jméno: 
Váš e-mail: 
Předmět: 

:-)  :-(  ;)  :D  :S  spatne  dobre  bold  italic  email  citace  odkaz  obrazek 
Antispam ochrana u neregistrovaných uživatelů - opište čísla z obrázku:
  

Toto fórum je provozováno také jako emailová konference s e-mailovou adresou java [a] builder.cz.
Podrobný návod jak se k odběru zpráv e-mailem přihlásit naleznete v tomto návodu.




  



Toto je neredigovaná a nemoderovaná diskuse čtenářů serveru Builder.cz. Redakce ani provozovatel serveru za obsah jednotlivých příspěvků nenese zodpovědnost.

info@builder.cz
Vydává Grafika Publishing, s.r.o.
Copyright (c) 1997-2005 Všechna práva vyhrazena
Pro diskuzní fóra využíváme software z phorum.org