फॉर्म को फिर से शुरू करने से रोकना


107

पेज एक में HTML फॉर्म होता है। पृष्ठ दो - वह कोड जो प्रस्तुत किए गए डेटा को संभालता है।

पेज एक में फॉर्म जमा हो जाता है। ब्राउज़र पृष्ठ दो पर पुनर्निर्देशित हो जाता है। पृष्ठ दो जमा किए गए डेटा को संभालता है।

इस बिंदु पर, यदि पृष्ठ दो ताज़ा हो जाता है, तो "पुष्टि फ़ॉर्म पुनः सबमिट करें" अलर्ट पॉप हो जाता है।

क्या इसे रोका जा सकता है?


पुष्टिकरण संवाद का उपयोग करें: stackoverflow.com/questions/6457750/form-confirm-before-submit/…

3
पोस्ट पोस्टडायरेक्ट का उपयोग करें जैसा कि यहाँ वर्णित है - >> en.wikipedia.org/wiki/Post/Redirect/Get
ME

आप इसे पुनर्निर्देशन के बिना भी रोक सकते हैं। देखो यहाँ
यूजेन Konkov

जवाबों:


145

लोगों को यहाँ ले जाने के लिए 2 दृष्टिकोण हैं:

विधि 1: AJAX + रीडायरेक्ट का उपयोग करें

इस तरह आप पृष्ठ 2 में JQuery या कुछ इसी तरह का उपयोग करते हुए पृष्ठभूमि में अपना फॉर्म पोस्ट करते हैं, जबकि उपयोगकर्ता अभी भी पृष्ठ 1 प्रदर्शित करता है। सफल पोस्टिंग पर, आप ब्राउज़र को Page2 पर पुनर्निर्देशित करते हैं।

विधि 2: पोस्ट + स्व पर पुनर्निर्देशित

यह मंचों पर एक आम तकनीक है। Page1 पर फ़ॉर्म डेटा को Page2 पर पोस्ट करता है, Page2 डेटा को संसाधित करता है और वह करता है जिसे करने की आवश्यकता है, और फिर यह स्वयं पर एक HTTP रीडायरेक्ट करता है। इस तरह से अंतिम "एक्शन" ब्राउज़र को याद रखता है, पेज 2 पर एक सरल GET है, इसलिए F5 से फॉर्म को फिर से जमा नहीं किया जा रहा है।


2
विधि 2 का एक प्रकार दूसरे पृष्ठ पर पुनर्निर्देशित होता है। उदाहरण के लिए, आप POST to example.com/save.html और एक बार सेव करने के बाद, आप example.com/list.html पर रीडायरेक्ट करते हैं ।
गुइल्यूम

1
पद्धति 1 के साथ, मैं क्लाइंट को कुछ होने देने के लिए ब्लॉकयूआई नाम के jQuery प्लगइन का उपयोग करूंगा।
शिकिरू

मैं विधि 2 का उपयोग कर रहा हूं, लेकिन यह मुझे फिर से फिर से सबमिट करने के लिए कह रहा है यदि मैं इसे ताज़ा करता हूं। किसी को भी इस तरह की समस्या हो रही है?
उत्सुक

क्या आप सुनिश्चित हैं कि HTTP रीडायरेक्ट ठीक से काम कर रहा है? नेटवर्क इंस्पेक्टर / फायरबग खोलें / आपके ब्राउज़र में जावक HTTP अनुरोधों के निरीक्षण के लिए और HTTP कॉल की जाँच करें। आपको POST विधि के साथ होने वाले पहले एक (फॉर्म डेटा को पोस्ट करना) को देखना चाहिए, HTTP कोड 301 को स्थान हेडर के साथ खुद को इंगित करते हुए लौटना चाहिए, और फिर तुरंत आपको जीईटी विधि के साथ उसी पृष्ठ पर एक और HTTP क्वेरी दिखाई देनी चाहिए।
CodeTwice

@CodeTwice: मेरे मामले में, पृष्ठ 1 पर पेज 2 पर पोस्ट, पेज 2 डेटा को प्रोसेस करता है और एक पेज दिखाता है (टेम्प्लेट में दिए जा रहे मानों के साथ) .. रीडायरेक्ट कहां होना चाहिए? .. पेज में GET अनुरोध नहीं है।
user1050619

24

आपको पीआरजी - पोस्ट / रीडायरेक्ट / गेट पैटर्न का उपयोग करने की आवश्यकता है और आपने पीजी के पीजी को लागू किया है। आपको रीडायरेक्ट करने की आवश्यकता है । (अब दिन आपको पुनर्निर्देशन की बिल्कुल भी आवश्यकता नहीं है। यह देखें)

PRG एक वेब डेवलपमेंट डिज़ाइन पैटर्न है जो कुछ डुप्लिकेट फॉर्म सबमिशन को रोकता है जिसका अर्थ है, सबमिट फॉर्म (पोस्ट रिक्वेस्ट 1) -> रीडायरेक्ट -> गेट (रिक्वेस्ट 2)

Under the hood

पुनर्निर्देशित स्थिति कोड - HTTP 302 के साथ HTTP 1.0 HTTP 302 या HTTP 1.1

रीडायरेक्ट स्थिति कोड के साथ एक HTTP प्रतिक्रिया अतिरिक्त रूप से स्थान हेडर फ़ील्ड में एक URL प्रदान करेगी। उपयोगकर्ता एजेंट (उदाहरण के लिए एक वेब ब्राउज़र) को इस कोड के साथ एक प्रतिक्रिया द्वारा आमंत्रित किया जाता है, ताकि दूसरे, समान, स्थान क्षेत्र में निर्दिष्ट नए URL के लिए अनुरोध किया जा सके।

रीडायरेक्ट स्थिति कोड यह सुनिश्चित करने के लिए है कि इस स्थिति में, वेब उपयोगकर्ता का ब्राउज़र प्रारंभिक HTTP POST अनुरोध को फिर से शुरू किए बिना सर्वर प्रतिक्रिया को सुरक्षित रूप से ताज़ा कर सकता है।

Double Submit Problem

डबल सबमिट समस्या

Post/Redirect/Get Solution

पोस्ट / रीडायरेक्ट / समाधान प्राप्त करें

स्रोत


2
अच्छे खर्च। मैं सोच रहा हूं कि यदि रीडायरेक्ट किए जाने के बाद उपयोगकर्ता ब्राउज़र पर बैक बटन क्लिक करता है तो क्या होगा। क्या "पुर्नप्रमाण फ़ॉर्म पुनर्जीवन" पॉपअप शो फिर से होगा। मुझे लगता है कि भले ही पुष्टिकरण पॉपअप फिर से न दिखे, एक ही डेटा के साथ पेज 1 पर एक पोस्ट अनुरोध फिर से किया जाएगा और एक बार फिर उपयोगकर्ता को पृष्ठ 2 पर पुनः निर्देशित किया जाएगा। मेरे पास प्रपत्रों की एक श्रृंखला है, form1, form2, form3। मूल रूप से "n" से "n-1" के रूप में कैसे वापस जा सकते हैं। रैंडम प्रश्न: आपने PRG डिजाइन पैटर्न का अध्ययन कहां किया
Rpant

@Rpant chrome पर php फ़ाइल जो लोकेशन हेडर भेजती है, ब्राउज़र इतिहास में भी दिखाई नहीं देती है, इसलिए बैक बटन बस आपको फॉर्म में वापस ले जाता है।
फ्लोरेसेंटग्रीन

@Angelin रीडायरेक्ट करने के बाद डेटा कैसे मिलेगा? जब मैं कुछ डेटा / some_url और redirect / some_url पर पोस्ट करता हूं, जो GET अनुरोध करता है। मुझे कैसे पता चलेगा कि क्या प्रतिक्रिया होनी चाहिए / some_url जेनेरिक है और एक id जैसे / some_url / <id> को नहीं जोड़ता है?
अमित त्रिपाठी

@AmitTripathi आपको खुद बनाना होगा। उदाहरण: POST अनुरोध ग्राहक डेटा डालने का हो सकता है जबकि GET सफल सम्मिलित किए गए डेटा का प्रदर्शन होगा। आप डेटा को दिखाने में सक्षम होंगे क्योंकि यह कुछ भी नहीं था, लेकिन फॉर्म डेटा या डेटाबेस में सफल प्रविष्टि के बाद आपके द्वारा प्राप्त ग्राहक आईडी द्वारा उस ग्राहक के लिए डेटाबेस से प्राप्त करके ग्राहक पृष्ठ के दृश्य का पुन: उपयोग करें।
एंजेलिन नादर

लेकिन मैं @Eugen Konkov समाधान
नादर

10

सीधे तौर पर, आप नहीं कर सकते, और यह एक अच्छी बात है। ब्राउज़र का अलर्ट एक कारण से है। इस धागे को आपके प्रश्न का उत्तर देना चाहिए:

POST पुष्टिकरण अलर्ट दिखाने से बैक बटन को रोकें

सुझाए गए दो प्रमुख वर्कअराउंड PRG पैटर्न थे, और एक AJAX सबमिट एक स्क्रिप्टिंग स्थानांतरण के बाद।

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


8

100% होने का एकमात्र तरीका यह सुनिश्चित करता है कि एक ही फॉर्म दो बार जमा नहीं किया जाता है, आपके द्वारा जारी किए गए प्रत्येक में एक विशिष्ट पहचानकर्ता को एम्बेड करना है और जो सर्वर पर सबमिट किए गए हैं उन्हें ट्रैक करना है। वहाँ नुकसान यह है कि यदि उपयोगकर्ता उस पृष्ठ पर वापस आ जाता है जहाँ फ़ॉर्म था और नए डेटा में प्रवेश करता है, तो वही फ़ॉर्म काम नहीं करेगा।


6

उत्तर के दो भाग हैं:

  1. सुनिश्चित करें कि डुप्लिकेट पोस्ट आपके डेटा के साथ सर्वर साइड पर गड़बड़ न करें। ऐसा करने के लिए, पोस्ट में एक विशिष्ट पहचानकर्ता को एम्बेड करें ताकि आप बाद के अनुरोधों को सर्वर की ओर खारिज कर सकें। इस पैटर्न को मैसेजिंग शब्दों में Idempotent Receiver कहा जाता है ।

  2. सुनिश्चित करें कि उपयोगकर्ता दोनों द्वारा डुप्लिकेट सबमेट्स की संभावना से परेशान नहीं है

    • POST के बाद एक GET पर पुनर्निर्देशन (POST पुनर्निर्देशित GET पैटर्न)
    • जावास्क्रिप्ट का उपयोग करके बटन को अक्षम करना

आप 2 के तहत कुछ भी नहीं करते हैं। लोग बहुत तेजी से क्लिक कर सकते हैं और हैकर वैसे भी पोस्ट कर सकते हैं। आपको हमेशा 1 की आवश्यकता है। यदि आप पूरी तरह से सुनिश्चित होना चाहते हैं कि कोई डुप्लिकेट नहीं है।


2

यदि आप POST डेटा वाले किसी पेज को रिफ्रेश करते हैं, तो ब्राउजर आपके रिजेक्ट होने की पुष्टि करेगा। यदि आप GET डेटा का उपयोग करते हैं, तो संदेश प्रदर्शित नहीं होगा। आपके पास दूसरा पेज भी हो सकता है, सबमिशन सेव करने के बाद, बिना डेटा वाले तीसरे पेज पर रीडायरेक्ट करें।


2

वैसे मैंने पाया कि किसी ने भी इस ट्रिक का उल्लेख नहीं किया।

पुनर्निर्देशन के बिना, आप अभी भी ताज़ा होने पर फॉर्म की पुष्टि को रोक सकते हैं।

डिफ़ॉल्ट रूप से, फॉर्म कोड इस प्रकार है:

<form method="post" action="test.php">

अब इसे बदल दें <form method="post" action="test.php?nonsense=1">

आप जादू देखेंगे।

मुझे लगता है कि क्योंकि ब्राउज़र पुष्टि चेतावनी पॉपअप ट्रिगर नहीं होगा अगर यह यूआरएल में एक GET विधि (क्वेरी स्ट्रिंग) हो जाता है।


2

आप jquery का उपयोग करके ऐसा कर सकते हैं

<script>
   $(document).ready(function(){
   window.history.replaceState('','',window.location.href)
   });
</script>

पोस्ट बैक के कारण सबमिट करने के बाद दोबारा डेटा को रोकने का यह सबसे सुरुचिपूर्ण तरीका है।

उम्मीद है की यह मदद करेगा।


0

पीआरजी पैटर्न केवल पेज रिफ्रेशिंग के कारण होने वाले पुनर्जीवन को रोक सकता है। यह 100% सुरक्षित उपाय नहीं है।

आमतौर पर, मैं पुनर्निधारण को रोकने के लिए नीचे कार्रवाई करूंगा:

  1. क्लाइंट साइड - एक बटन पर डुप्लिकेट क्लिक को रोकने के लिए जावास्क्रिप्ट का उपयोग करें जो फॉर्म सबमिशन को ट्रिगर करेगा। आप पहले क्लिक के बाद बटन को निष्क्रिय कर सकते हैं।

  2. सर्वर साइड - मैं जमा किए गए मापदंडों पर एक हैश की गणना करेगा और उस हैश को सत्र या डेटाबेस में बचाएगा, इसलिए जब डुप्लिकेट सबमिट किया गया था तो हम डुप्लिकेट का पता लगा सकते हैं फिर क्लाइंट को उचित प्रतिक्रिया दे सकते हैं। हालाँकि, आप क्लाइंट की तरफ हैश जनरेट करने का प्रबंधन कर सकते हैं।

अधिकांश अवसरों में, ये उपाय पुनर्जीवन को रोकने में मदद कर सकते हैं।


0

मुझे वास्तव में @ एंजेलिन का उत्तर पसंद है। लेकिन अगर आप कुछ विरासत कोड के साथ काम कर रहे हैं जहां यह व्यावहारिक नहीं है, तो यह तकनीक आपके लिए काम कर सकती है।

फ़ाइल के शीर्ष पर

// Protect against resubmits
if (empty($_POST))  {
   $_POST['last_pos_sub'] = time();
} else {
     if (isset($_POST['last_pos_sub'])){
        if ($_POST['last_pos_sub'] == $_SESSION['curr_pos_sub']) {
           redirect back to the file so POST data is not preserved
        }
        $_SESSION['curr_pos_sub'] = $_POST['last_pos_sub'];
     }
}

फिर फॉर्म के अंत में, last_pos_subनिम्नानुसार चिपकाएँ:

<input type="hidden" name="last_pos_sub" value=<?php echo $_POST['last_pos_sub']; ?>>

0

ट्रिस आज़माएँ:

function prevent_multi_submit($excl = "validator") {
    $string = "";
    foreach ($_POST as $key => $val) {
    // this test is to exclude a single variable, f.e. a captcha value
    if ($key != $excl) {
        $string .= $key . $val;
    }
    }
    if (isset($_SESSION['last'])) {
    if ($_SESSION['last'] === md5($string)) {
        return false;
    } else {
        $_SESSION['last'] = md5($string);
        return true;
    }
    } else {
    $_SESSION['last'] = md5($string);
    return true;
    }
}

कैसे उपयोग करें / उदाहरण:

if (isset($_POST)) {
    if ($_POST['field'] != "") { // place here the form validation and other controls
    if (prevent_multi_submit()) { // use the function before you call the database or etc
        mysql_query("INSERT INTO table..."); // or send a mail like...
        mail($mailto, $sub, $body); // etc
    } else {
        echo "The form is already processed";
    }
    } else {
    // your error about invalid fields
    }
}

फ़ॉन्ट: https://www.tutdepot.com/prevent-multiple-form-submission/


0

डेटा जोड़ने से रोकने के लिए js का उपयोग करें:

if ( window.history.replaceState ) {
    window.history.replaceState( null, null, window.location.href );
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.