4.23 Jak zapobiec powtórnemu submitowi formularza?

Ostatnia modyfikacja: 2003-03-26 19:34:34

Propozycje są cztery:

Skrypt przetwarzający dane z formularza po swoim zakończeniu powinien przekierować przeglądarkę na inna stronę. Odświeżenie jej nie wywoła powtórnego submita, jednak cofając się guzikiem back w przeglądarce możemy znów doprowadzić do sytuacji, w której formularz zostanie wywołany ponownie.

Drugie rozwiązanie bazuje na unikalnej zmiennej przekazywanej razem z danymi formularza w polu typu hidden. Tworząc stronę z formularzem zmiennej takiej przypisujemy wygenerowany string, a następnie w momencie przetwarzania wyników sprawdzamy czy taki identyfikator był już przesyłany. Dobrze jest trzymać identyfikatory np. w bazie danych i czyścić je raz na jakiś czas. Dzięki temu klient nawet jeśli cofnie się do strony z formularzem i wykona ponowny submit nie uzyska porządnego efektu. Natomiast, aby ponownie dodać cos od siebie będzie musiał kliknąć odśwież bezpośrednio na stronie z formularzem, a to spowoduje wyczyszczenie jego zawartości.

Trzecie rozwiązanie jest analogiczne do drugiego jednak bazuje na cookies/sesjach. Nie zawsze mamy możliwość korzystać z bazy. Tym razem po przesłaniu formularza w przeglądarce klienta ustawiamy cookie zawierające informacje, że dany formularz został już wypełniony. Przykładowo przypisujemy wartość true do cookie o nazwie np. moj_formularz. Skrypt przetwarzający dane dla tego formularza powinien weryfikować obecność cookie o tej nazwie. Opcjonalnie dane te możemy przechowywać w sesji.

Jeśli trzy sposoby nam mało możemy jeszcze weryfikować zmienną HTTP_REFERER. Gdy zawiera ona adres do akutalnej strony wtedy możemy uznać, że nastąpiło odświeżenie. Pamiętać jednak należy, iż przeglądarka nie musi przesłać tej zmiennej w nagłówkach.


Powrót do indeksu