การส่งแบบฟอร์มซ้ำเป็นปัญหาที่พบบ่อยที่สุดในเว็บแอปพลิเคชันผู้ใช้หลายคนและทำให้เกิดปัญหามากมาย มีสถานการณ์แอปพลิเคชันมากมายที่พบปัญหาการส่งซ้ำเช่น:
คลิกปุ่มส่งสองครั้ง คลิกปุ่มรีเฟรช ทำซ้ำการกระทำก่อนหน้านี้โดยใช้ปุ่มย้อนกลับของเบราว์เซอร์ทำให้เกิดการส่งแบบฟอร์มซ้ำ ๆ ทำซ้ำแบบฟอร์มการส่งโดยใช้ประวัติเบราว์เซอร์ คำขอ HTTP ซ้ำจากเบราว์เซอร์
หลายวิธีในการป้องกันการส่งแบบฟอร์มซ้ำ ๆ
1. ปิดการใช้งานปุ่มส่ง ใช้ JavaScript เพื่อให้ปุ่มส่งปิดการใช้งานหลังจากส่งแบบฟอร์ม วิธีนี้ป้องกันไม่ให้ผู้ใช้ใจร้อนจากการคลิกปุ่มหลายครั้ง แต่มีปัญหา หากไคลเอนต์ห้าม JavaScript วิธีนี้จะไม่ถูกต้องบทความก่อนหน้าของฉันบอกว่าการใช้ปลั๊กอิน jQuery บางอย่างทำงานได้ดี
2. post/redirect/get Mode ดำเนินการเปลี่ยนเส้นทางหน้าหลังจากส่งซึ่งเรียกว่าโหมดโพสต์-เรดไดเร็กต์ (PRG) กล่าวโดยย่อเมื่อผู้ใช้ส่งแบบฟอร์มคุณจะทำการเปลี่ยนเส้นทางไคลเอนต์และไปที่หน้าข้อมูลความสำเร็จในการส่งสิ่งนี้สามารถหลีกเลี่ยงการส่งซ้ำที่เกิดจากผู้ใช้ที่กด F5 และจะไม่มีคำเตือนของการส่งแบบฟอร์มเบราว์เซอร์ซ้ำ ๆ ซ้ำ ๆ และยังสามารถกำจัดปัญหาเดียวกันกับที่เกิดจากเบราว์เซอร์ไปข้างหน้าและ backpression ของเบราว์เซอร์
3. เก็บโลโก้พิเศษในเซสชั่น เมื่อมีการร้องขอหน้าแบบฟอร์มจะมีการสร้างสตริงธงอักขระพิเศษซึ่งมีอยู่ในเซสชันและวางไว้ในฟิลด์ที่ซ่อนอยู่ของแบบฟอร์ม เมื่อรับข้อมูลแบบฟอร์มการประมวลผลให้ตรวจสอบว่าสตริงการระบุตัวตนมีอยู่หรือไม่และลบออกจากเซสชันทันทีจากนั้นประมวลผลข้อมูลตามปกติหรือไม่หากคุณพบว่าไม่มีสตริงการตั้งค่าสถานะที่ถูกต้องในการส่งแบบฟอร์มหมายความว่ามีการส่งแบบฟอร์มและการส่งนี้จะถูกละเว้น
สิ่งนี้ทำให้เว็บแอปพลิเคชันของคุณมีการป้องกัน XSRF ขั้นสูงมากขึ้น
4. เพิ่มข้อ จำกัด ในฐานข้อมูล เพิ่มข้อ จำกัด ที่ไม่ซ้ำกันในฐานข้อมูลหรือสร้างดัชนีที่ไม่ซ้ำกันเพื่อป้องกันข้อมูลที่ซ้ำกัน นี่เป็นวิธีที่มีประสิทธิภาพที่สุดในการป้องกันการส่งข้อมูลซ้ำ ๆข้างต้นเป็นการแนะนำวิธีการทั้ง 4 นี้ หากคุณมีทางออกที่ดีกว่าโปรดบอกฉันและบทความนี้จะได้รับการปรับปรุงอย่างต่อเนื่อง