เพื่อแก้ปัญหาการส่งแบบฟอร์มซ้ำ ๆ ในโครงการมีสถานการณ์ต่อไปนี้ในโครงการทั่วไปที่อาจส่งแบบฟอร์มซ้ำอาจเกิดขึ้นเช่น:
1. เนื่องจากเซิร์ฟเวอร์ช้าหรือการหน่วงเวลาของเครือข่ายคลิกปุ่มส่งซ้ำ ๆ
2. การส่งเสร็จสมบูรณ์แล้ว แต่หน้าประสบความสำเร็จได้รับการรีเฟรช
3. การส่งเสร็จสมบูรณ์แล้ว เมื่อถอยกลับคลิกปุ่มส่งอีกครั้ง
สถานการณ์ทั้งหมดเหล่านี้อาจทำให้ข้อมูลซ้ำซ้อนเดียวกันมากเกินไปที่จะสร้างในฐานข้อมูลและทรัพยากรฐานข้อมูลเสีย การส่งต่อจะปรากฏขึ้นเท่านั้นและการเปลี่ยนเส้นทางจะไม่
วิธีแก้ปัญหาสำหรับกรณีแรก (โดยใช้ JavaScript) ไม่ทำงานสำหรับสองหลัง:
ก่อนอื่นเพิ่มรหัส JavaScript ในรูปแบบต่อไปนี้ไปยังหน้า
var submentFlag = false; ฟังก์ชั่น checksubmit () {ถ้า (! submentFlag) {submitFlag = true; document.forms [0] .submit (); -(1) เมื่อแอตทริบิวต์ประเภทของปุ่มส่งเป็นปุ่ม:
เพียงตั้งค่าปุ่ม onclick =” checksubmit ();”
(2) เมื่อมีการส่งแอตทริบิวต์ประเภทของการส่ง:
ตั้งค่าปุ่ม onclick = "checksubmit ();" และเพิ่ม onsubmit = "returnfalse" ไปยังแท็ก <form> เนื่องจากเมื่อมีการส่งปุ่มส่งโดยอัตโนมัติหลังจากส่งเหตุการณ์การคลิก onsubmit จะถูกตั้งค่าเป็น "returnFalse" การส่งปุ่มส่งอัตโนมัติจะไม่ถูกต้อง
สำหรับสองสถานการณ์ต่อไปนี้คุณสามารถใช้เซสชันเพื่อแก้ปัญหาได้ หลักการคือการวางข้อมูลในเซสชันเมื่อเรียกใช้หน้าเพิ่มข้อมูลจากนั้นส่งข้อมูลไปยัง Servlet สำหรับการประมวลผลบนหน้า servlet ได้รับข้อมูลในเซสชัน หากมีข้อมูลในเซสชันที่ไม่ว่างให้ใส่ข้อมูลลงในฐานข้อมูลแล้วลบข้อมูลในเซสชัน ข้อมูลในเซสชันจะว่างเปล่าในครั้งต่อไปที่ส่งแบบฟอร์มจากนั้นกระบวนการข้อมูลที่เก็บไว้จะไม่ถูกดำเนินการ
อย่างไรก็ตามเพียงแค่ใช้เซสชันมีข้อ จำกัด ดังนั้นในการพัฒนาจริงโดยทั่วไปจะใช้ในการใช้เซสชันรวมกับ UUID เพื่อแก้ไขการส่งแบบฟอร์มซ้ำ ๆ รหัสมีดังนี้:
กำหนดชั้นเรียน uuidtoken
ชั้นเรียนสาธารณะ uuidtoken {ส่วนตัว uuidtoken uuidtoken = ใหม่ uuidtoken (); uuidtoken ส่วนตัว () {} สาธารณะคงที่ uuidtoken getuuidtoken () {return uuidtoken; UUIDSTR = UUID.RANDOMUUID (). TOSTRING (); ถ้า (UUIDSTR! = NULL) {Session.SetAttribute ("Session.UUID", UUIDSTR);} return UUIDST;}/*** พิจารณาว่า UUID ที่บันทึกไว้ในเซสชั่น isuuidValidate (คำขอ httpservletrequest) {// รับเซสชันที่มีอยู่ httpsession session = request.getSession (false); ถ้า (เซสชัน == null) {return false;} string sessionUuid = (string) session.getAttribute ("session.uuid"); htmlluuid = request.getParameter ("html.uuid"); ถ้า (htmlluuid == null) {return false;} return sessionuuid.equals (htmlluuid);}/** * ลบ uuid */public synchronizized session = request.getSession (false); if (session == null) {return;} session.removeattribute ("session.uuid");}}เพิ่มโดเมนที่ซ่อนอยู่ในหน้า JSP ใช้ UUID เพื่อสร้างหมายเลขประจำตัวที่ไม่ซ้ำกันกำหนดให้กับโดเมนที่ซ่อนอยู่และวางหมายเลขประจำตัวที่ไม่ซ้ำกันลงในสำเนาของเซสชัน รหัสมีดังนี้:
<อินพุต type = "hidden" name = "html.uuid" value = '<%= uuidToken.getUuIdToken (). getUUIDASSTR (คำขอ)%>'>
หลังจากส่งไปยัง servlet ให้รับค่าของโดเมนที่ซ่อนอยู่ของหน้า JSP และเปรียบเทียบค่าของโดเมนที่ซ่อนอยู่กับค่าที่วางไว้ในเซสชัน หากเหมือนกันให้บันทึกข้อมูลและลบ UUID ออกจากเซสชัน หากไม่เหมือนกันก็หมายความว่าเป็นการส่งซ้ำและไม่มีการประมวลผล
Boolean Flag = uuidtoken.getuuidtoken (). isuuidValidate (คำขอ); ถ้า (ธง) {// บันทึกข้อมูลลงในฐานข้อมูล // ลบ uuidtoken.getuuidtoken (). resetuuid (คำขอ);สรุป
ข้างต้นเป็นเรื่องเกี่ยวกับการอภิปรายสั้น ๆ ของบทความนี้เกี่ยวกับการใช้เซสชันเพื่อป้องกันการส่งแบบฟอร์มซ้ำ ๆ ฉันหวังว่ามันจะเป็นประโยชน์กับทุกคน เพื่อนที่สนใจสามารถอ้างถึงหัวข้ออื่น ๆ ที่เกี่ยวข้องในเว็บไซต์นี้ต่อไป หากมีข้อบกพร่องใด ๆ โปรดฝากข้อความไว้เพื่อชี้ให้เห็น ขอบคุณเพื่อนที่ให้การสนับสนุนเว็บไซต์นี้!