Pierwsza strona zawiera formularz HTML. Strona druga - kod obsługujący przesłane dane.
Formularz na pierwszej stronie zostanie przesłany. Przeglądarka zostanie przekierowana na drugą stronę. Strona druga obsługuje przesłane dane.
W tym momencie, jeśli strona druga zostanie odświeżona, pojawi się komunikat „Potwierdź ponowne przesłanie formularza”.
Czy można temu zapobiec?
Odpowiedzi:
Istnieją 2 podejścia, które ludzie stosowali tutaj:
Metoda 1: Użyj przekierowania AJAX +
W ten sposób wysyłasz swój formularz w tle za pomocą JQuery lub czegoś podobnego do Page2, podczas gdy użytkownik nadal widzi wyświetlaną stronę 1. Po pomyślnym wysłaniu przekierowujesz przeglądarkę do strony 2.
Metoda 2: Opublikuj + przekierowanie do siebie
Jest to powszechna technika na forach. Formularz na Stronie 1 wysyła dane do Strony 2, Strona 2 przetwarza dane i robi to, co trzeba, a następnie dokonuje przekierowania HTTP na siebie. W ten sposób ostatnią „czynnością”, jaką przeglądarka pamięta, jest proste GET na stronie 2, więc formularz nie jest ponownie przesyłany po naciśnięciu klawisza F5.
źródło
Musisz użyć wzorca PRG - Post / Redirect / Get i właśnie zaimplementowałeś P z PRG. Musisz przekierować .(W dni, kiedy w ogóle nie potrzebujesz przekierowania. Zobacz to )PRG to wzorzec projektowania stron internetowych, który zapobiega niektórym zduplikowanym przesyłaniu formularzy, co oznacza, Prześlij formularz (Post Request 1) -> Redirect -> Get (Request 2)
Kod statusu przekierowania - HTTP 1.0 z HTTP 302 lub HTTP 1.1 z HTTP 303
Odpowiedź HTTP z kodem statusu przekierowania będzie dodatkowo zawierać adres URL w polu nagłówka lokalizacji. Agent użytkownika (np. Przeglądarka internetowa) jest proszony przez odpowiedź z tym kodem, aby wykonać drugie, poza tym identyczne, żądanie do nowego adresu URL określonego w polu lokalizacji.
Kod stanu przekierowania ma zapewnić, że w tej sytuacji przeglądarka użytkownika sieci WWW może bezpiecznie odświeżyć odpowiedź serwera bez powodowania ponownego przesyłania początkowego żądania HTTP POST.
Źródło
źródło
Bezpośrednio nie możesz i to dobrze. Alert przeglądarki nie ma powodu. Ten wątek powinien odpowiedzieć na Twoje pytanie:
Zapobiegaj wyświetlaniu przez przycisk Wstecz alertu potwierdzającego POST
Dwa kluczowe sugerowane obejścia to wzorzec PRG i przesłanie AJAX, po którym nastąpiło przeniesienie skryptu.
Zwróć uwagę, że jeśli Twoja metoda zezwala na metodę przesyłania GET, a nie POST, to zarówno rozwiązałoby problem, jak i lepiej pasowałoby do konwencji. Te rozwiązania są dostarczane przy założeniu, że chcesz / potrzebujesz POST dane.
źródło
Jedynym sposobem, aby mieć 100% pewności, że ten sam formularz nigdy nie zostanie przesłany dwukrotnie, jest osadzenie unikalnego identyfikatora w każdym wydanym formularzu i śledzenie, które z nich zostały przesłane na serwer. Pułapka polega na tym, że jeśli użytkownik utworzy kopię zapasową na stronie, na której znajdował się formularz, i wprowadzi nowe dane, ten sam formularz nie zadziała.
źródło
Odpowiedź składa się z dwóch części:
Upewnij się, że zduplikowane posty nie psują danych po stronie serwera. Aby to zrobić, umieść w poście unikalny identyfikator, abyś mógł odrzucać kolejne żądania po stronie serwera. Ten wzorzec jest nazywany Idempotentnym Odbiornikiem w terminologii wiadomości.
Upewnij się, że użytkownikowi nie przeszkadza możliwość podwójnego przesłania przez oba
Żadne czynności, które wykonujesz poniżej 2., nie zapobiegną zduplikowanym przesyłaniu. Ludzie mogą klikać bardzo szybko, a hakerzy i tak mogą publikować. Zawsze potrzebujesz 1., jeśli chcesz mieć absolutną pewność, że nie ma duplikatów.
źródło
Jeśli odświeżysz stronę z danymi POST, przeglądarka potwierdzi ponowne przesłanie. Jeśli korzystasz z danych GET, komunikat nie zostanie wyświetlony. Możesz również mieć drugą stronę, po zapisaniu zgłoszenia, przekierować na trzecią stronę bez danych.
źródło
Cóż, nikt nie wspomniał o tej sztuczce.
Bez przekierowania nadal możesz zapobiec potwierdzaniu formularza podczas odświeżania.
Domyślnie kod formularza wygląda tak:
<form method="post" action="test.php">
teraz zmień to na
<form method="post" action="test.php?nonsense=1">
Zobaczysz magię.
Wydaje mi się, że to dlatego, że przeglądarki nie wywołają wyskakującego okienka z alertem potwierdzenia, jeśli otrzyma metodę GET (ciąg zapytania) w adresie URL.
źródło
Możesz to zrobić za pomocą jquery
Jest to najbardziej elegancki sposób zapobiegania ponownemu przesyłaniu danych po przesłaniu z powrotem.
Mam nadzieję że to pomoże.
źródło
Wzorzec PRG może jedynie zapobiec ponownemu przesłaniu spowodowanemu odświeżeniem strony. Nie jest to w 100% bezpieczny środek.
Zazwyczaj podejmę poniższe działania, aby zapobiec ponownemu przesłaniu:
Strona klienta - użyj javascript, aby zapobiec zduplikowanym kliknięciom przycisku, który spowoduje przesłanie formularza. Możesz po prostu wyłączyć przycisk po pierwszym kliknięciu.
Strona serwera - obliczę hash na przesłanych parametrach i zapiszę ten hash w sesji lub w bazie danych, aby po otrzymaniu zduplikowanego zgłoszenia można było wykryć duplikację, a następnie właściwą odpowiedź do klienta. Możesz jednak wygenerować skrót po stronie klienta.
W większości przypadków środki te mogą pomóc w zapobieganiu ponownemu złożeniu wniosku.
źródło
Naprawdę podoba mi się odpowiedź @ Angelin. Ale jeśli masz do czynienia z jakimś starszym kodem, w którym nie jest to praktyczne, ta technika może Ci pomóc.
U góry pliku
Następnie na końcu formularza wkleić w
last_pos_sub
następujący sposób:źródło
Wypróbuj tris:
Jak używać / przykład:
Czcionka: https://www.tutdepot.com/prevent-multiple-form-submission/
źródło
użyj js, aby zapobiec dodawaniu danych:
źródło