2010-02-24 11 views
17

Jaki jest najlepszy sposób uniknięcia duplikowania składania formularza na wiosnę. Czy ta struktura zapewnia jakąś specjalną funkcję do rozwiązania tego problemu (na przykład jako Synchronizer Token w Struts)?Powielanie formularza na wiosnę

+1

To nie jest specyficzne dla każdej struktury, ale można zapobiec duplikowaniu przesyłania za pomocą jQuery. http://stackoverflow.com/questions/2830542/prevent-double-submission-of-forms-in-jquery/4473801#4473801 –

Odpowiedz

35

Istnieją różne sposoby, aby uniknąć podwójnego podnosi, które mogą być łączone:

  1. użyć JavaScript do disable przycisk kilka ms po kliknięciu. Pozwoli to uniknąć wielokrotnego przesyłania powodowanego przez niecierpliwych użytkowników, którzy klikają kilka razy na przycisku.

  2. Wyślij przekierowanie po przesłaniu, jest to znane jako Post-Redirect-Get (PRG) pattern. Zapobiegnie to wielokrotnemu przesyłaniu spowodowanemu przez użytkowników, którzy naciskają klawisz F5 na stronie wyników i ignorują ostrzeżenie przeglądarki, że dane zostaną wysłane ponownie lub nawigację wstecz i wstecz za pomocą przycisków wstecz/przodu przeglądarki i zignorowanie tego samego ostrzeżenia.

  3. Generowanie unikalnego tokena po zażądaniu strony i umieszczanie zarówno w zakresie sesji, jak i ukrytym polu formularza. Podczas przetwarzania sprawdź, czy jest token, a następnie usuń go natychmiast z sesji i kontynuuj przetwarzanie. Jeśli nie ma tokena, to przetwarzanie bloku. Pozwoli to uniknąć wyżej wymienionych rodzajów problemów.

Wiosną można użyć RedirectView jako wdrożenie wzoru PRG (jak opisano w punkcie 2). Pozostałe dwa punkty należy wprowadzić samemu.

+0

Witam Zastosowałem wzór PRG. to działa dobrze. ale muszę przekazać wiadomość, aby uzyskać metodę "Identyfikator użytkownika 1001 utworzony pomyślnie". dla tego mam zmienną klasy kontrolera, która ustawi jej wartość w metodzie post i otrzyma ją w metodzie GET. Stworzy to problem dla współbieżnego użytkownika. Jak mogę uniknąć tego problemu? –

+0

@Dhrumil: Przechowuj go w sesji lub plik cookie. – BalusC

+0

nie zajmuje więcej czasu na przetwarzanie. Zamiast naszej ręcznej struktury kodowania należy podać pewne funkcje, takie jak tokeny, które Struts2.0 zapewnia domyślnie. –

4

Po prostu zrób przekierowanie po poście. Po pomyślnym przesłaniu formularza po zwróceniu ModelAndView upewnij się, że widok jest widokiem przekierowania. Z POV użytkownika przesyła formularz, a następnie jest przekierowywany, aby uzyskać "GET" na inny adres URL. W ten sposób nie będą się podwójnie zgłaszać.

Należy zauważyć, że podczas korzystania z widoku przekierowania atrybuty modelu stają się widoczne w adresie URL jako parametry. Więc możesz zachować atrybuty tak cienkie, jak to tylko możliwe. Zazwyczaj wyświetlam użytkownikowi stronę, która tak naprawdę nie zawiera żadnych unikatowych informacji, a jedynie komunikat "potwierdź".