เราพบแบบฟอร์มจำนวนนับไม่ถ้วนบนอินเทอร์เน็ตทุกวัน และเรายังพบว่าแบบฟอร์มส่วนใหญ่ไม่ได้จำกัดผู้ใช้ไม่ให้ส่งแบบฟอร์มเดียวกันหลายครั้ง การไม่มีข้อจำกัดดังกล่าวในบางครั้งอาจทำให้เกิดผลลัพธ์ที่ไม่คาดคิด เช่น การสมัครสมาชิกบริการอีเมลซ้ำๆ หรือการลงคะแนนซ้ำๆ บางทีผู้เริ่มต้น ASP บางคนไม่ทราบวิธีจำกัดการส่งแบบฟอร์มเดียวกันซ้ำในแอปพลิเคชัน ASP ดังนั้นที่นี่ฉันจะแนะนำวิธีง่ายๆ เพื่อป้องกันไม่ให้ผู้ใช้ส่งแบบฟอร์มเดียวกันหลายครั้งในระหว่างเซสชันปัจจุบันในแอปพลิเคชัน ASP
งานนี้ส่วนใหญ่ประกอบด้วยสี่รูทีนย่อย ในแอปพลิเคชันที่เรียบง่าย คุณจะต้องใส่รหัสเหล่านี้ในไฟล์ที่รวมไว้สำหรับการอ้างอิงโดยตรง สำหรับสภาพแวดล้อมที่ซับซ้อนมากขึ้น เราจะให้คำแนะนำในการปรับปรุงบางอย่างในตอนท้ายของบทความ
1. กระบวนการทำงานขั้นพื้นฐาน
ด้านล่างเราจะพูดถึงรูทีนย่อยทั้งสี่นี้ตามลำดับ
(1) การเริ่มต้น
ที่นี่เราจำเป็นต้องบันทึกตัวแปรสองตัวในอ็อบเจ็กต์เซสชัน โดยที่:
⑴ แต่ละแบบฟอร์มสอดคล้องกับตัวระบุเฉพาะที่เรียกว่า FID และใช้ตัวนับเพื่อทำให้ค่านี้ไม่ซ้ำกัน
⑵ เมื่อใดก็ตามที่ส่งแบบฟอร์มสำเร็จ FID จะต้องถูกจัดเก็บไว้ในออบเจ็กต์พจนานุกรม
เราใช้กระบวนการเฉพาะเพื่อเริ่มต้นข้อมูลข้างต้น แม้ว่าจะถูกเรียกโดยรูทีนย่อยแต่ละอันในอนาคต แต่จริงๆ แล้วจะมีการดำเนินการเพียงครั้งเดียวเท่านั้นในระหว่างแต่ละเซสชัน:
Sub InitializeFID()
ถ้าไม่ใช่ IsObject(Session("FIIDList")) จากนั้น
ตั้งค่าเซสชัน ("FIIDList")=Server.CreateObject("Scripting.Dictionary")
เซสชั่น("FID")=0
สิ้นสุดถ้า
End Sub
(2) สร้างตัวระบุเฉพาะของแบบฟอร์ม
ฟังก์ชันต่อไปนี้ GenerateFID() ใช้เพื่อสร้างตัวระบุเฉพาะของแบบฟอร์ม ฟังก์ชันนี้จะเพิ่มค่า FID ขึ้น 1 ก่อนแล้วจึงส่งคืน:
Function GenerateFID()
เตรียมใช้งาน FID
เซสชั่น("FID") = เซสชั่น("FID") + 1
สร้าง FID = เซสชัน ("FID")
ฟังก์ชั่นสิ้นสุด
(3) ลงทะเบียนแบบฟอร์มที่ส่ง
เมื่อส่งแบบฟอร์มสำเร็จ ให้ลงทะเบียนตัวระบุที่ไม่ซ้ำกันในวัตถุพจนานุกรม:
Sub RegisterFID()
หรี่ strFID
เตรียมใช้งาน FID
strFID = คำขอ ("FID")
เซสชัน("FIDlist") เพิ่ม strFID ตอนนี้()
สิ้นสุดย่อย
(4) ตรวจสอบว่ามีการส่งแบบฟอร์มซ้ำๆ หรือไม่
ก่อนที่จะประมวลผลแบบฟอร์มที่ผู้ใช้ส่งมาอย่างเป็นทางการ คุณควรตรวจสอบว่า FID ได้รับการลงทะเบียนในวัตถุพจนานุกรมหรือไม่ ฟังก์ชัน CheckFID() ต่อไปนี้ใช้เพื่อดำเนินงานนี้ให้เสร็จสมบูรณ์ หากได้รับการลงทะเบียนแล้ว จะส่งกลับ FALSE มิฉะนั้นจะส่งกลับ TRUE:
ฟังก์ชัน CheckFID()
หรี่ strFID
เตรียมใช้งาน FID
strFID = คำขอ ("FID")
CheckFID = ไม่ใช่เซสชัน ("FIDlist") มีอยู่ (strFID)
ฟังก์ชันสิ้นสุด
2. วิธีใช้
มีสองที่ที่ใช้ฟังก์ชันข้างต้น คือ เมื่อสร้างแบบฟอร์มและเมื่อประมวลผลผลลัพธ์ สมมติว่ามีการวางรูทีนย่อยสี่รายการข้างต้นไว้ในไฟล์ Forms.inc โค้ดต่อไปนี้จะกำหนดว่าจะสร้างฟอร์มหรือประมวลผลผลลัพธ์ของฟอร์มตามค่า FID หรือไม่ กระบวนการประมวลผลที่อธิบายนั้นเหมาะสำหรับแอปพลิเคชัน ASP ส่วนใหญ่:
< %ตัวเลือกที่ชัดเจน%>
< !--#include file="forms.inc"-->
<HTML>
<หัว><
<TITLE>การทดสอบการส่งแบบฟอร์ม</TITLE>
</HEAD
<ร่างกาย>
-
ถ้า Request("FID") = "" จากนั้น
สร้างแบบฟอร์ม
อื่น
กระบวนการแบบฟอร์ม
สิ้นสุดถ้า
-
</ร่างกาย><
< /HTML>
< GenerateForm มีหน้าที่สร้างแบบฟอร์ม ซึ่งควรมี FID ที่ซ่อนอยู่ เช่น:
< %
สร้างแบบฟอร์มย่อย()
-
< การกระทำของฟอร์ม = "< %=Request.ServerVariables("PATH_INFO")%><" method=GET>
< ประเภทอินพุต=ชื่อที่ซ่อนอยู่=ค่า FID="< %=GenerateFID()%><">
<ประเภทอินพุต=ชื่อข้อความ="param1" value="">
<ประเภทอินพุต=ค่าส่ง="ตกลง"><
</แบบฟอร์ม>
-
จบหมวดย่อย
%>
ProcessForm มีหน้าที่รับผิดชอบในการประมวลผลเนื้อหาที่ส่งผ่านแบบฟอร์ม แต่ก่อนที่จะประมวลผล ควรเรียก CheckFID() เพื่อตรวจสอบว่าแบบฟอร์มปัจจุบันถูกส่งไปแล้วหรือไม่ รหัสจะเป็นดังนี้:
< %
แบบฟอร์มกระบวนการย่อย()
ถ้า CheckFID() แล้ว
Response.Write "สิ่งที่คุณป้อนคือ" & Request.QueryString("param1")
ลงทะเบียนFID
อื่น
ตอบกลับเขียนว่า "แบบฟอร์มนี้ส่งได้เพียงครั้งเดียวเท่านั้น!"
สิ้นสุดถ้า
จบหมวดย่อย
%>
3. ข้อจำกัดและมาตรการปรับปรุง
ข้างต้นเราได้แนะนำวิธีการจำกัดไม่ให้ส่งแบบฟอร์มเดียวกันหลายครั้งในระหว่างเซสชันปัจจุบัน ในการใช้งานจริง อาจต้องมีการปรับปรุงในหลายด้าน เช่น
⑴ ตรวจสอบความถูกต้องตามกฎหมายของข้อมูลที่ผู้ใช้ป้อนก่อนลงทะเบียน ID แบบฟอร์ม เพื่อว่าเมื่อข้อมูลผิดกฎหมาย ผู้ใช้สามารถกดปุ่ม "ย้อนกลับ" ปุ่มเพื่อส่งคืนและส่งแบบฟอร์มเดิมอีกครั้งหลังจากแก้ไขแล้ว
⑵ ข้อจำกัดในการส่งแบบฟอร์มนี้ใช้ได้เฉพาะในช่วงระยะเวลาของเซสชันปัจจุบันเท่านั้น หากจำเป็นต้องมีข้อจำกัดนี้เพื่อขยายหลายเซสชัน Cookeis หรือฐานข้อมูลจะถูกนำมาใช้เพื่อบันทึกข้อมูลที่เกี่ยวข้อง