2012-02-24 8 views
8

में दुर्भावनापूर्ण व्यवहार को रोकने के लिए सीमित दर किसी ने मुझे उस एप्लिकेशन में कुछ त्रुटियों के बारे में अवगत कराया है जो मैं काम कर रहा हूं (ज्यादातर मेरे जावास्क्रिप्ट के सामने के अंत में), जो कि एक टन पर क्लिक करने की संभावना खोलता है बटन एक बार में और लेनदेन संबंधी ईमेल का एक टन भेजना। यह स्पष्ट रूप से अच्छा नहीं है।ExpressJS

मुझे लगता है कि एक्सप्रेसजेएस में इसे संभालने का एक तरीका app.all() का उपयोग करके एक निश्चित समय सीमा के भीतर होने वाले अनुरोधों की संख्या को गिनने के लिए है। मैं इसे टाइमस्टैम्प के साथ सत्र मेटाडेटा में संग्रहीत करता हूं, और यदि वाई से अधिक अनुरोध वाई समय में होते हैं, तो सीमा समाप्त होने तक मैं थोड़ी देर के लिए उन्हें काट देता हूं।

क्या किसी ने इससे पहले यह किया है या मेरी मदद करने के लिए कोई टिप्स/संकेत हैं? कुछ ऐसा जो मेरे ऐप में और बाहर छोड़ना आसान है, बेहतर है। धन्यवाद!

+1

इस संभाल करने के लिए सबसे अच्छा तरीका है यकीन है कि ईमेल या तो गैर अवरुद्ध और व्यवहार नहीं कर रहे हैं बनाने के लिए है। – Raynos

उत्तर

2

आप अपने वेबपृष्ठ में Collate ऑब्जेक्ट का उपयोग कर सकते हैं।

function Collate(timeout) { 
    this.timeout = timeout || 1000; 
} 
Collate.prototype = { 
    time: 0, 

    idle: function() { 
    var t = new Date().getTime(); 
    return (t - this.time > this.timeout && (this.time = t)); 
    }, 

    prefer: function(func) { 
    this.func = func; 
    clearTimeout(this.timer); 
    this.timer = setTimeout(func, this.timeout); 
    } 
}; 

यदि आप एक बार चलाने के लिए एक फ़ंक्शन चाहते हैं और अगले 1 सेकंड में फिर से नहीं चलना चाहते हैं। की तरह यदि आप एक विधि कई बार प्रस्तुत करने से उपयोगकर्ता को रोकने के लिए चाहते हैं, आप ऐसा करते हैं:

var timer = new Collate(3000); //3 seconds 
button1.onclick = function() { 
    if(timer.idle()) { 
     button1.form.submit(); 
    } else alert("Don't click too quickly!"); 
} 

//or on the form tag 

<script>var submitTimer = new Collate(3000);</script> 
<form action="post" onsubmit="return submitTimer.idle();"> 

आप एक घटना को कई बार आग और केवल पिछली बार इसे आग पर प्रतिक्रिया करना चाहते हैं की आशा करते हैं। की तरह यदि आप के बाद एक उपयोगकर्ता टाइपिंग समाप्त हो गया है खोज करना चाहते हैं, आप ऐसा करते हैं:

var timer = new Collate(700); //0.7 seconds 
textfield1.onkeyup = function() { 
    timer.prefer(function() { 
     autocomplete.search(textfield1.value); 
    }); 
}; 
+4

इस तरह का क्लाइंट-साइड समाधान केवल उपयोगकर्ता द्वारा आकस्मिक कार्रवाई को रोकने के लिए काम करेगा, लेकिन आवश्यक रूप से 'दुर्भावनापूर्ण' उपयोगकर्ता के कार्यों (वे केवल पोस्ट और जीईटी मैन्युअल रूप से भेज सकते हैं)। – Kitsune

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