Halaman pertama berisi formulir HTML. Halaman dua - kode yang menangani data yang dikirimkan.
Formulir di halaman pertama dikirimkan. Browser dialihkan ke halaman dua. Halaman dua menangani data yang dikirimkan.
Pada titik ini, jika halaman dua disegarkan, peringatan "Konfirmasi Pengiriman Ulang Formulir" akan muncul.
Bisakah ini dicegah?
Jawaban:
Ada 2 pendekatan yang biasa dilakukan orang di sini:
Metode 1: Gunakan AJAX + Redirect
Dengan cara ini Anda memposting formulir Anda di latar belakang menggunakan JQuery atau sesuatu yang mirip dengan Page2, sementara pengguna masih melihat halaman1 ditampilkan. Setelah pengeposan berhasil, Anda mengarahkan browser ke Halaman2.
Metode 2: Poskan + Alihkan ke diri sendiri
Ini adalah teknik umum di forum. Formulir di Halaman1 memposting data ke Halaman2, Halaman2 memproses data dan melakukan apa yang perlu dilakukan, dan kemudian melakukan pengalihan HTTP pada dirinya sendiri. Dengan cara ini, "tindakan" terakhir yang diingat browser adalah GET sederhana di halaman2, jadi formulir tidak dikirim kembali ke F5.
sumber
Anda perlu menggunakan PRG - Post / Redirect / Get pola dan Anda baru saja mengimplementasikan P dari PRG. Anda perlu Redirect .(Sekarang hari Anda tidak perlu pengalihan sama sekali. Lihat ini )PRG adalah pola desain pengembangan web yang mencegah beberapa pengiriman formulir duplikat yang artinya, Kirim formulir (Kirim Permintaan 1) -> Redirect -> Dapatkan (Permintaan 2)
Kode status pengalihan - HTTP 1.0 dengan HTTP 302 atau HTTP 1.1 dengan HTTP 303
Respons HTTP dengan kode status pengalihan juga akan memberikan URL di bidang tajuk lokasi. Agen pengguna (misalnya browser web) diundang oleh respons dengan kode ini untuk membuat permintaan kedua, jika tidak identik, ke URL baru yang ditentukan di bidang lokasi.
Kode status pengalihan adalah untuk memastikan bahwa dalam situasi ini, browser pengguna web dapat menyegarkan respons server dengan aman tanpa menyebabkan permintaan HTTP POST awal dikirim ulang.
Sumber
sumber
Secara langsung, Anda tidak bisa, dan itu hal yang baik. Peringatan browser ada karena suatu alasan. Utas ini harus menjawab pertanyaan Anda:
Mencegah tombol Kembali menampilkan peringatan konfirmasi POST
Dua solusi utama yang disarankan adalah pola PRG, dan pengiriman AJAX diikuti dengan relokasi skrip.
Perhatikan bahwa jika metode Anda memungkinkan metode pengiriman GET dan bukan metode pengiriman POST, itu akan menyelesaikan masalah dan lebih sesuai dengan konvensi. Solusi tersebut disediakan dengan asumsi Anda ingin / perlu data POST.
sumber
Satu-satunya cara untuk 100% yakin bahwa formulir yang sama tidak pernah dikirimkan dua kali adalah dengan menyematkan pengenal unik di setiap yang Anda terbitkan dan melacak mana yang telah dikirimkan di server. Kesulitannya adalah jika pengguna kembali ke halaman tempat formulir itu dan memasukkan data baru, formulir yang sama tidak akan berfungsi.
sumber
Ada dua bagian untuk menjawabnya:
Pastikan postingan duplikat tidak mengacaukan data Anda di sisi server. Untuk melakukan ini, sematkan pengenal unik di posting sehingga Anda dapat menolak sisi server permintaan berikutnya. Pola ini disebut Penerima Idempoten dalam istilah perpesanan.
Pastikan pengguna tidak terganggu oleh kemungkinan pengiriman duplikat oleh keduanya
Tidak ada yang Anda lakukan di bawah 2. benar-benar akan mencegah pengiriman duplikat. Orang dapat mengklik dengan sangat cepat dan peretas tetap dapat memposting. Anda selalu membutuhkan 1. jika Anda ingin benar-benar yakin tidak ada duplikat.
sumber
Jika Anda menyegarkan halaman dengan data POST, browser akan mengkonfirmasi pengiriman ulang Anda. Jika Anda menggunakan GET data, pesan tersebut tidak akan ditampilkan. Anda juga dapat memiliki halaman kedua, setelah menyimpan kiriman, mengarahkan ke halaman ketiga tanpa data.
sumber
Yah saya tidak menemukan ada yang menyebutkan trik ini.
Tanpa pengalihan, Anda masih dapat mencegah konfirmasi formulir saat menyegarkan.
Secara default, kode formulir seperti ini:
<form method="post" action="test.php">
sekarang, ubah menjadi
<form method="post" action="test.php?nonsense=1">
Anda akan melihat keajaiban.
Saya kira itu karena browser tidak akan memicu popup peringatan konfirmasi jika mendapat metode GET (string kueri) di url.
sumber
Anda dapat melakukannya dengan menggunakan jquery
Ini adalah cara paling elegan untuk mencegah data kembali setelah dikirimkan karena posting kembali.
Semoga ini membantu.
sumber
Pola PRG hanya dapat mencegah pengiriman ulang yang disebabkan oleh penyegaran halaman. Ini bukan tindakan yang 100% aman.
Biasanya, saya akan mengambil tindakan di bawah untuk mencegah pengiriman ulang:
Sisi Klien - Gunakan javascript untuk mencegah klik ganda pada tombol yang akan memicu pengiriman formulir. Anda bisa menonaktifkan tombol setelah klik pertama.
Sisi Server - Saya akan menghitung hash pada parameter yang dikirimkan dan menyimpan hash itu dalam sesi atau database, sehingga ketika pengiriman duplikat diterima, kami dapat mendeteksi duplikasi kemudian memberikan respons yang tepat kepada klien. Namun, Anda dapat membuat hash di sisi klien.
Di sebagian besar kesempatan, tindakan ini dapat membantu mencegah pengiriman ulang.
sumber
Saya sangat suka jawaban @ Angelin. Tetapi jika Anda berurusan dengan beberapa kode lama di mana ini tidak praktis, teknik ini mungkin berhasil untuk Anda.
Di bagian atas file
Kemudian di akhir formulir, tempelkan
last_pos_sub
sebagai berikut:sumber
Coba tris:
Cara menggunakan / contoh:
Font: https://www.tutdepot.com/prevent-multiple-form-submission/
sumber
gunakan js untuk mencegah penambahan data:
sumber