2008-09-24 15 views
15

पर कई बार डेटा पोस्ट करने से कैसे रोकते हैं मैं एक वेब एप्लिकेशन (जे 2 ईई) पर काम कर रहा हूं और मैं ब्राउज़र से डबल पोस्ट को संभालने के लिए उपलब्ध विकल्पों को जानना चाहता हूं।किसी उपयोगकर्ता को वेबसाइट

  • जैसे ही उपयोगकर्ता उस पर क्लिक के रूप में सबमिट बटन को अक्षम करें:

    समाधान है कि मैंने देखा और अतीत में इस्तेमाल किया है सभी क्लाइंट साइड कर रहे हैं।

  • जब उपयोगकर्ता बैक बटन पर क्लिक करता है तो POST को रोकने के लिए POST-Redirect-GET पैटर्न का पालन करें।
  • फॉर्म की ऑन सबमिट ईवेंट को संभालें और जावास्क्रिप्ट के साथ जमा करने की स्थिति का ट्रैक रखें।

यदि संभव हो तो मैं सर्वर साइड समाधान को लागू करना पसंद करूंगा। क्या ऊपर वर्णित किए गए लोगों की तुलना में कोई बेहतर दृष्टिकोण है, या क्लाइंट-साइड समाधान सर्वोत्तम हैं?

उत्तर

8

बेवकूफ-सबूत समाधान को लागू करना मुश्किल है (क्योंकि वे हमेशा बेवकूफों में सुधार कर रहे हैं)। कोई फर्क नहीं पड़ता कि आप क्या करते हैं, ग्राहक पक्ष को छेड़छाड़ या गलत तरीके से निष्पादित किया जा सकता है।

आपका समाधान विश्वसनीय और सुरक्षित होने के लिए सर्वर पक्ष होना चाहिए। ने कहा, एक दृष्टिकोण अनुरोध की समीक्षा करना है और यह निर्धारित करने के लिए सिस्टम/डेटाबेस स्थिति या लॉग जांचना है कि यह पहले ही संसाधित हो चुका है या नहीं। आदर्श रूप से, यदि संभव हो तो सर्वर पक्ष की प्रक्रिया idempotent होना चाहिए, और यदि यह नहीं हो सकता है तो उसे डुप्लिकेट सबमिट के विरुद्ध सुरक्षा करनी होगी।

8

आप फ़ॉर्म के हिस्से के रूप में "टिकट" की आपूर्ति कर सकते हैं, कुछ यादृच्छिक संख्या - और सुनिश्चित करें कि यह सर्वर की तरफ दो बार स्वीकार नहीं किया जाता है।

+0

कैसे आप (अधिकांश ब्राउज़र को पुन: अनुरोध नहीं है), वापस बटन दबाने रूप में डेटा को बदलने, और फिर से एक ही "टिकट" सबमिट करने के लिए एक उपयोगकर्ता निपटेंगे? – JeremyWeir

+4

आप उपयोगकर्ता को एक ही टिकट के साथ एक नया अनुरोध पुनः सबमिट करने से नहीं रोक सकते हैं, लेकिन आप इसे "डुप्लिकेट अनुरोध" त्रुटि के साथ सर्वर पक्ष पर अस्वीकार कर सकते हैं। – zigdon

+0

ठीक है, लेकिन लोग इसे उद्देश्य पर करते हैं - एक फॉर्म सबमिट करें, वापस दबाएं क्योंकि उन्हें पता है कि उन्हें कुछ सही करने की आवश्यकता है, फिर फॉर्म सबमिट करें। रिकॉर्ड को संपादित करने के लिए ब्राउज़र के बैक बटन का उनका वैध उपयोग एक त्रुटि के परिणामस्वरूप होगा। – JeremyWeir

3

दो सर्वर साइड समाधान दिमाग में आते हैं:

  1. एक गुप्त फ़ॉर्म क्षेत्र में एक बार प्रयोग "टोकन" बनाएँ। एक बार टोकन का उपयोग करने के बाद, इसे किसी भी डेटाबेस या सत्र संदर्भ ऑब्जेक्ट से हटा दिया जाता है जिसे आप इसे संग्रहीत कर रहे हैं। दूसरी बार, यह स्वीकार नहीं किया जाता है।
  2. कैश की जानकारी प्राप्त हुई, और यदि एक निश्चित समय अवधि के भीतर एक समान रूप प्राप्त होता है (10 मिनट? एक घंटा? आप तय करते हैं!) इसे अनदेखा किया जाता है।
+0

1. आप बैक बटन दबाकर उपयोगकर्ता को कैसे प्रबंधित करते हैं (अधिकांश ब्राउज़र फिर से अनुरोध नहीं करते हैं), फ़ॉर्म में डेटा बदलते हैं, और उसी टोकन को दोबारा सबमिट करते हैं? 2. क्या होगा यदि समय अवधि के भीतर फॉर्म को मान ए के साथ सबमिट किया गया है, तो उपयोगकर्ता इसे मान बी के रूप में बदलता है, फिर इसे फिर से मूल्य ए में बदल देता है? क्या वह अंतिम परिवर्तन को अनदेखा नहीं करेगा? – JeremyWeir

2

अनुरोध के साथ जाने और इसे निष्पादन के साथ लॉग इन करने के लिए एक अद्वितीय को कार्यान्वित करें। अगर आईडी पहले ही लॉग हो चुकी है, तो आप फिर से नौकरी नहीं करते हैं। यह फॉलबैक समाधान की तरह है - आपको बटन या लिंक क्लाइंटसाइड के साथ-साथ आपको

-2

का उपयोग करना चाहिए और मैं अपने सर्वर साइड कोड के साथ मूल्यों की तुलना करना चाहता हूं। यदि दो टाइमस्टैम्प पर्याप्त करीब हैं और एक ही आईपी पता है, तो दूसरे फॉर्म सबमिशन को अनदेखा करें।

+0

सेशन ने सर्वर साइड सॉल्यूशन – paan

+0

से अनुरोध किया है कि मैंने पोस्ट को सावधानीपूर्वक पर्याप्त नहीं पढ़ा है, लेकिन मैंने अपना जवाब संपादित किया है, इसलिए यह प्रश्न के अनुरूप है। – VirtuosiMedia

+0

और क्या होगा यदि उपयोगकर्ता के पास वास्तव में डेटा के दो बिट हैं, तो वे उस समय अवधि में पोस्ट करना चाहते हैं? कठिन भाग्य आपका एवर लगता है। – roryf

2

हम एक समय संवेदनशील, एक बार टिकट का उपयोग करते हैं। यह सॉर्ट की एक सत्र आईडी की तरह है। लेकिन यह फॉर्म/पेज से जुड़ा हुआ है।

जब उपयोगकर्ता पृष्ठ सबमिट करता है तो आप टिकट को त्याग देते हैं, और आप केवल वैध टिकट के साथ आने वाले पृष्ठों को संसाधित करते हैं। आप एक ही समय में, उपयोगकर्ता को टिकट संलग्न करके सुरक्षा को कस कर सकते हैं, इसलिए यदि कोई टिकट उस उपयोगकर्ता द्वारा सबमिट किया जाता है जो उस उपयोगकर्ता द्वारा सबमिट किया जाता है जो टिकट नहीं दिया गया था, तो आप अनुरोध को अस्वीकार कर सकते हैं।

संबंधित मुद्दे