Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Javascript > Preventing duplicate form submission

Reply
Thread Tools

Preventing duplicate form submission

 
 
Oleg Konovalov
Guest
Posts: n/a
 
      10-31-2006
Hi,

I have a Java/JavaScript GUI application where I perform a lot of long DB
operations
[e.g. massive SQL Insert's], which takes 5-60 secs to perform.
Sometimes user double-clicks the button or just gets impatient and clicks
again,
which created duplicate forcm submission and hence duplicate records.
So I am trying to disable the button as soon as it is clicked, and as soon
as it's done,
re-enable it again.

I tried to do it in Javascript, just simple: <input... name=Save...
onclick="enabled=true;">
and as soon as screen refreshes, it re-enables the button automatically.
That works in some cases, however when I need to do some other Javascript
operation
(e.g. validate the fields on the screen), disabling the button automatically
stops both Javascript
and associated form action in Java which is totally unacceptable.

Is there any other simple solution to such problems in Java or Javascript ?
Maybe AJAX ?

Any help is very appreciate. Please provide a code sample or a pointer to
the resources.

Thank you in advance,
Oleg.
P.S.: It probably doesn't matter much, but that is a Cocoon2.0/XSLT app
with Actions in Java [servlet based], using JDK1.4.2 and IE6.


 
Reply With Quote
 
 
 
 
hiwa
Guest
Posts: n/a
 
      10-31-2006
Oleg Konovalov wrote:
> .....

Search the cljp news group with 'token pattern'.

 
Reply With Quote
 
 
 
 
Gray Matter
Guest
Posts: n/a
 
      10-31-2006
On Tue, 31 Oct 2006 04:31:26 GMT, "Oleg Konovalov"
<(E-Mail Removed)> wrote:

>Hi,
>
>I have a Java/JavaScript GUI application where I perform a lot of long DB
>operations
>[e.g. massive SQL Insert's], which takes 5-60 secs to perform.
>Sometimes user double-clicks the button or just gets impatient and clicks
>again,
>which created duplicate forcm submission and hence duplicate records.
>So I am trying to disable the button as soon as it is clicked, and as soon
>as it's done,
>re-enable it again.
>
>I tried to do it in Javascript, just simple: <input... name=Save...
>onclick="enabled=true;">
>and as soon as screen refreshes, it re-enables the button automatically.
>That works in some cases, however when I need to do some other Javascript
>operation
>(e.g. validate the fields on the screen), disabling the button automatically
>stops both Javascript
>and associated form action in Java which is totally unacceptable.
>
>Is there any other simple solution to such problems in Java or Javascript ?
>Maybe AJAX ?
>
>Any help is very appreciate. Please provide a code sample or a pointer to
>the resources.
>
>Thank you in advance,
>Oleg.
>P.S.: It probably doesn't matter much, but that is a Cocoon2.0/XSLT app
>with Actions in Java [servlet based], using JDK1.4.2 and IE6.
>


If you're able to submit multiple, duplicate records, the database
most likely does not have proper constraints set up. Good software
design practices do not rely on the GUI to prevent multiple
submissions.
 
Reply With Quote
 
Mark Rafn
Guest
Posts: n/a
 
      10-31-2006
Oleg Konovalov <(E-Mail Removed)> wrote:
>I have a Java/JavaScript GUI application where I perform a lot of long DB
>operations
>[e.g. massive SQL Insert's], which takes 5-60 secs to perform.


Don't do these synchronously. It's just mean to users, and a bad design. You
should use a background thread to do the inserts, and have a status page that
auto-refreshes (or uses AJAX if you're fancy) until the operation is complete.

>Sometimes user double-clicks the button or just gets impatient and clicks
>again, which created duplicate forcm submission and hence duplicate records.


Make your call idempotent. Include on the form a unique identifier (cf
java.util.UUID) that gets submitted along with the data, and the server
can simply ignore duplicate submissions.

>So I am trying to disable the button as soon as it is clicked, and as soon
>as it's done, re-enable it again.


Good. This is a nice backup to the above. But if you do it right, you
never need to re-enable it explicitly. The form submission disables it, and
the results page doesn't have the button on it. When the user wants to make
a new submission, they go to the submission page, where it's enabled because
it's a new load of the page.

>and as soon as screen refreshes, it re-enables the button automatically.


So don't do that. Don't refresh the page, go to a results page instead.

>That works in some cases, however when I need to do some other Javascript
>operation (e.g. validate the fields on the screen), disabling the button
>automatically stops both Javascript and associated form action in Java
>which is totally unacceptable.


What? I don't understand this requirement. If you're showing the user a
form, it is because you want them to submit it. If you don't want them to
submit it, don't show the form. Showing a form that you can validate but not
submit is lunacy.

>Is there any other simple solution to such problems in Java or Javascript ?
>Maybe AJAX ?


Design your app rationally. There's no technological pixie dust that fixes a
bad design.
--
Mark Rafn http://www.velocityreviews.com/forums/(E-Mail Removed) <http://www.dagon.net/>
 
Reply With Quote
 
Arne Vajh°j
Guest
Posts: n/a
 
      11-01-2006
Gray Matter wrote:
> On Tue, 31 Oct 2006 04:31:26 GMT, "Oleg Konovalov"
> <(E-Mail Removed)> wrote:
>> I have a Java/JavaScript GUI application where I perform a lot of long DB
>> operations
>> [e.g. massive SQL Insert's], which takes 5-60 secs to perform.
>> Sometimes user double-clicks the button or just gets impatient and clicks
>> again,
>> which created duplicate forcm submission and hence duplicate records.
>> So I am trying to disable the button as soon as it is clicked, and as soon
>> as it's done,
>> re-enable it again.


> If you're able to submit multiple, duplicate records, the database
> most likely does not have proper constraints set up. Good software
> design practices do not rely on the GUI to prevent multiple
> submissions.


Not necesarrily.

Maybe not even likely.

Only INSERT where the business rules guarantee a field
mapped to user input to be unique should fall in that
category.

Arne
 
Reply With Quote
 
Lew
Guest
Posts: n/a
 
      11-01-2006

Mark Rafn wrote:
> Make your call idempotent. Include on the form a unique identifier (cf
> java.util.UUID) that gets submitted along with the data, and the server
> can simply ignore duplicate submissions.


I have seen variations on the token pattern in Web forms -

- The cited approach - a hidden field that keys the transaction. Presumably
the key is matched to a session token that is kept until the transaction
completes.

- A session token that is generated on page load and removed from the session
upon first submit; absent the token the transaction request is ignored. This
does not require unique token values.
session.setAttribute( "idempotency", SAME_VALUE_EVERY_TIME );

It surprised me when I first read of this pattern that the writer espoused the
latter variant.

I wonder of the advantages, disadvantages and gotchas of each approach.

IMHO:
- The second seems slightly more elegant, and idioms of void appeal to me
anyway. (Checking for absence, rather than checking for presence.) Checkng
for absence is slightly simpler than checking for equality.

- Second one has slightly less work to do, without UUIDs.

- First one might be more extendible in the security aspect.

/Lew
 
Reply With Quote
 
Tor Iver Wilhelmsen
Guest
Posts: n/a
 
      11-01-2006
"Oleg Konovalov" <(E-Mail Removed)> writes:

> I have a Java/JavaScript GUI application where I perform a lot of
> long DB operations [e.g. massive SQL Insert's], which takes 5-60
> secs to perform.


Look into optimizing that using JDBC batches.

As another poster suggested, return to the user immediately after
setting up the job in a different thread. However, since you're really
not supposed to fire off threads in app-server containers - even
servlet containers - it would be better to deliver the "job" to a JMS
queue and have some other app read from it and do the actual database
work.

Some open-source products to help you get there:

ActiveMQ for the JMS bit:

http://www.activemq.org/site/home.html

Or take the plunge into using the MULE ESB container if you want to
automate as much as possible of the work:

http://mule.mulesource.org/wiki/display/MULE/Home
 
Reply With Quote
 
Oleg Konovalov
Guest
Posts: n/a
 
      11-04-2006
Any Javascript or Ajax solutions ?


"hiwa" <(E-Mail Removed)> wrote in message
news:(E-Mail Removed) oups.com...
> Oleg Konovalov wrote:
>> .....

> Search the cljp news group with 'token pattern'.
>
>



 
Reply With Quote
 
Lew
Guest
Posts: n/a
 
      12-05-2006
(f-u set to clj.programmer)

Oleg Konovalov wrote:
> Hi,
>
> I have a Java/JavaScript GUI application where I perform a lot of long DB
> operations
> [e.g. massive SQL Insert's], which takes 5-60 secs to perform.
> Sometimes user double-clicks the button or just gets impatient and clicks
> again,
> which created duplicate forcm submission and hence duplicate records.
> So I am trying to disable the button as soon as it is clicked, and as soon
> as it's done,
> re-enable it again.


Trying to disable a browser control (back button, refresh) from the server is
wrong and fraught with difficulty.

Make your transactions idempotent and stop trying to screw up people's browsers.

Another poster already referred you to the Token pattern. It is a solution.

- Lew
 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
Preventing duplicate form submission Oleg Konovalov Java 14 12-06-2006 02:22 AM
Duplicate submission prevention cool2005 Java 3 09-26-2006 08:01 AM
Preventing a 2nd form submission CJM ASP General 8 06-14-2005 07:20 PM
preventing accidental form submission shortbackandsides.no@spam.hairdresser.net Javascript 3 09-28-2004 01:32 AM
duplicate form submission Boban Dragojlovic ASP .Net 2 02-03-2004 03:40 PM



Advertisments