Untuk memecahkan masalah pengajuan formulir berulang dalam proyek, ada situasi berikut dalam proyek -proyek biasa di mana pengajuan formulir berulang dapat terjadi, seperti:
1. Karena server lambat atau penundaan jaringan, klik tombol kirim berulang kali
2. Pengajuan telah berhasil diselesaikan, tetapi halaman yang sukses telah disegarkan
3. Pengajuan telah berhasil diselesaikan. Dengan jatuh kembali, klik tombol kirim lagi.
Semua situasi ini dapat menyebabkan terlalu banyak data redundan yang sama yang dihasilkan dalam database dan sumber daya basis data limbah. Hanya penerusan yang akan muncul, dan mengarahkan ulang tidak.
Solusi untuk kasus pertama (menggunakan JavaScript) tidak berfungsi untuk dua yang terakhir:
Pertama tambahkan kode JavaScript dalam format berikut ke halaman
var submitflag = false; function checkSubMit () {if (! SubMitFlag) {submitflag = true; Document.forms [0] .submit (); }}(1) Saat atribut tipe tombol kirim adalah tombol:
Cukup atur tombol OnClick = ”checkSubmit ();”.
(2) Saat atribut tipe tombol kirim dikirimkan:
Atur tombol OnClick = "checkSubmit ();" dan tambahkan onsubmit = "returnfalse" ke tag <sorm>. Karena ketika tombol kirim secara otomatis dikirimkan, setelah acara klik dikirimkan, OnSubmit diatur ke "ReturnFalse", pengajuan otomatis tombol Kirim akan tidak valid.
Untuk dua situasi berikut, Anda dapat menggunakan sesi untuk menyelesaikan masalah. Prinsipnya adalah menempatkan informasi di sesi saat menjalankan halaman penambahan informasi, dan kemudian mengirimkan informasi ke servlet untuk diproses pada halaman. Servlet memperoleh informasi di sesi. Jika ada informasi dalam sesi yang tidak kosong, masukkan informasi ke dalam database, dan kemudian hapus informasi di sesi. Informasi dalam sesi kosong pada saat formulir diserahkan, maka proses informasi yang disimpan tidak akan dieksekusi.
Namun, hanya menggunakan sesi memiliki keterbatasan, jadi dalam pengembangan aktual, umumnya digunakan untuk menggunakan sesi yang dikombinasikan dengan UUID untuk menyelesaikan pengiriman formulir yang berulang. Kodenya adalah sebagai berikut:
Tentukan kelas uuidtoken
public class UuidToken {private static UuidToken UuidToken=new UuidToken();private UuidToken(){}public static UuidToken getUuidToken() {return UuidToken;}public synchronized String getUUIDAsStr(HttpServletRequest request){HttpSession session=request.getSession();String uuidstr = uuid.randomuuid (). toString (); if (uuidstr! = null) {session.setAttribute ("session.uuid", uuidstr);} return uuidstr;}/** Tentukan apakah uuid disimpan dalam sesi dan uuid pada halaman jsp di halaman JSP ditentukan* iSuUIdValidate (permintaan httpservletRequest) {// Dapatkan sesi httpsession sesi yang ada = request.getSession (false); if (session == null) {return false;} string sessionuid = (string) session.getattribute ("session.uuid"); if (sessionuid = (= null) {"session.uuid"); if (sessionuid == null) {session htmlluuid = request.getParameter ("html.uuid"); if (htmlluuid == null) {return false;} return sessionuid.equals (htmlluuid);}/** * hapus uuid */public disinkronisasi void resetuuid (httpssved (httppps) {htpon -htpon (htQerps) {htQerps) {htQerps) {htQerps) session = request.getSession (false); if (session == null) {return;} session.removeattribute ("session.uuid");}}Tambahkan domain tersembunyi ke halaman JSP, gunakan UUID untuk menghasilkan nomor identifikasi yang unik, tetapkan ke domain tersembunyi, dan tempatkan nomor identifikasi unik ke dalam salinan sesi. Kodenya adalah sebagai berikut:
<input type = "hidden" name = "html.uuid" value = '<%= uuidtoken.getuuidtoken (). getuuidasStr (request)%>'>
Setelah mengirimkan ke servlet, dapatkan nilai domain tersembunyi dari halaman JSP, dan bandingkan nilai domain tersembunyi dengan nilai yang ditempatkan dalam sesi. Jika sama, simpan data dan hapus UUID dari sesi. Jika tidak sama, itu berarti bahwa itu adalah pengajuan berulang dan tidak ada pemrosesan yang dilakukan.
Boolean flag = uuidtoken.getuuidtoken (). Isuuidvalidate (permintaan); if (flag) {// simpan informasi ke database // hapus uuidtoken.getuuidtoken (). Resetuuid (permintaan);} else {System.out.println ("formulir berulang yang diulang (permintaan); {System.out.println (" FormMeringkaskan
Di atas adalah semua tentang diskusi singkat artikel ini tentang penggunaan sesi untuk mencegah pengiriman formulir yang berulang. Saya harap ini akan membantu semua orang. Teman yang tertarik dapat terus merujuk ke topik terkait lainnya di situs ini. Jika ada kekurangan, silakan tinggalkan pesan untuk menunjukkannya. Terima kasih teman atas dukungan Anda untuk situs ini!