[ALG] IE verstuurt meerdere keren formulier?

Pagina: 1
Acties:

  • Casteloni
  • Registratie: November 2001
  • Laatst online: 02-05 20:41
Voor een webapplicatie moet een gebruiker een x - aantal vragen beantwoorden. Dit gebeurt door middel van een simpel formulier. Er wordt een vraag getoond met een aantal antwoorden, de gebruiker klikt het juiste antwoord en en klikt vervolgens op volgende.

Het formulier wordt door middel van een POST naar een Struts Action gedirrigeerd. Deze actie verwerkt de input van de gebruiker, maakt de volgende vraag klaar en forward vervolgens naar dezelfde JSP pagina waar de vraag weer wordt getoond.

Het probleem
Om de applicatie te testen moet soms door deze hele serie vragen heen gelopen worden. Een van de testers houd hierbij de enter knop ingedrukt en klikt vervolgens de vragen aan. Op een gegeven ogenblik klapt de EJB Session bean eruit met de volgende error:
code:
1
2
3
javax.ejb.EJBException: Application Error: tried to enter Stateful bean with different tx context,
contextTx: TransactionImpl:XidImpl[FormatId=257, GlobalId=steven/497, BranchQual=, localId=497],
methodTx: TransactionImpl:XidImpl[FormatId=257, GlobalId=steven/493, BranchQual=, localId=493]

Na nader onderzoek bleek dat de struts actie meerdere keren dezelfde formulier binnenkreeg. In de logging zag ik een aantal keer achter elkaar dat dezelfde vraagnummer gebruikt werd om te verwerken. Volgens mij wordt er bij elke POST request een nieuwe thread aangemaakt en gaat het daar mis.

De vraag
Hoe zorg ik ervoor dat IE precies een keer een formulier submit en dat de 'bug' met het inhouden van de entertoets niet meer werkt?

Wat heb ik zelf geprobeerd
  1. De thread even laten wachten met het verwerken van de vraag ( werkt niet; probleem ligt aan de client side )
  2. Een boolean in de sessie plaatsen indien een Struts Action bezig is. ( werkt niet; er komen alsnog requests door )
  3. De tester Firefox laten gebruiker O-) ( daar doet het probleem zich niet voor )
Een mogelijke oplossing is misschien iets met een unieke ID elke keer als je het formulier submit. Maar dan zit je alsnog met een moment waarop de ID nog niet overal bekend is.

  • crisp
  • Registratie: Februari 2000
  • Laatst online: 00:21

crisp

Devver

Pixelated

Aangezien het een clientside probleem is moet je het m.i. ook clientside oplossen. Met javascript kan je na de 1e submit voorkomen dat er nog een keer gesubmit wordt.
Bij het gebruik van een submitbutton ligt daar vaak standaard al de focus op waardoor een enter ook het form submit. Je zou dus heel simpel de submitbutton kunnen uitschakelen bij de 1e submit:
HTML:
1
2
3
4
<form action="foo" method="post" onsubmit="this.elements['mysubmit'].disabled=true">
  ...
  <input type="submit" name="mysubmit" value="verder">
</form>


Een andere oplossing zou kunnen liggen in het gebruik van unieke tokens: maak een uniek token aan en sla dit serverside op. Zet het in het formulier in een hidden field. Na een submit kijk je of het token nog valid is en invalideer je het. Krijg je nu meerdere requests met hetzelfde (inmiddels niet meer geldige) token dan negeer je die.

Een combinatie van bovenstaande kan natuurlijk ook en werkt dan ook als javascript disabled is.

[ Voor 44% gewijzigd door crisp op 01-06-2005 23:47 ]

Intentionally left blank


  • Casteloni
  • Registratie: November 2001
  • Laatst online: 02-05 20:41
Je javascript oplossing heeft inderdaad geholpen! Bedankt _/-\o_

Ik zat eerst meer aan de server-side te denken, en daarbij komt ook nog dat ik niet zo heel handig ben met JS.