Hi.

Like Pat says, you need to synchronize/serialize your requests somehow.
I use a modified RequestControlFilter, originally from:
http://www.onjava.com/pub/a/onjava/2004/03/24/loadcontrol.html?page=1

You also need to prevent multiple submissions server-side.
I use a variation on the FlowSynchronizer from:
http://www.junlu.com/msg/85270.html

It should be easy to modify these to suit your requirements.

For instance, I didn't like the exceptions in FlowSynchronizer,
so I changed it to use a boolean that I can check in my form
listeners when I want to avoid multiple form submissions.

Cheers,
Nick.


Patrick Casey wrote:
        This ought to work:

        Step 1: Synchronize your servlet.doService() on the HttpSession so
that two user requests will never run in parallel.
        Step 2: Add a hidden, monotonically increasing (like a static
incrementer) hidden value to the form in question.
        Step 3: Add a LinkedHashMap to your Visit object called
"LastFiveSubmits". Set its removeOldest() to remove if the map size > 5.
        Step 4: When you get a "submit" request, check and see if you're
already handled a submit for this form in, say, the last 5 interactions. If
not, handle the submit, and stuff it's submission ID into the linkedhashmap
(from step 3).

        That should do the trick.

        Of course, using javascript to disable the submit button is much
easier, but if you can't, you can't.

        --- Pat



-----Original Message-----
From: Ralph Johnston [mailto:[EMAIL PROTECTED]
Sent: Tuesday, August 30, 2005 5:06 PM
To: Tapestry users
Subject: Preventing multiple form submission within Tapestry

Hi, we're working on a project in which we need to submit a form which
then creates
a record in a database on successful submission.  The problem we have is
that if
someone clicks on the submit button more than once, it creates duplicate
records of
the record that the person is trying to submit.

We've searched the mailing list archives (as best we can) with no luck.
We know
there is a way to prevent this using Javascript.  However, not all the
people using our
form are guaranteed to have Javascript enabled.  Therefore, we need a way
of
disabling the button or creating a semaphore of sorts to prevent multiple
submissions
that either create the new record or alter it in a drastic way.  Some
ideas we have
are...

1) Send back something that will disable the button's submit ability to
submit the form
again. For example, somehow killing TCP connection to that form until the
submit is
done.

2) Hanging when the submission occurs, like display a white page until
it's done so
that the user doesn't click something else and terminate the submission.

3) Letting the user do whatever he/she wants with the web page
particularly by
disabling all the other submit buttons but when the original submit
listener finishes
what it's doing, it redirects like we want it to do to the appropriate
page no matter
what page the user is on.

Any other ideas or even solutions would be appreciated. Thank you.

Ralph Johnston / Phil Whaley
The Pathfinder Group, Ltd.

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]





---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to