分前端和后端
一、前端
1、button标签点击后变成disabled
<form action="login" method="post">
<input type="text" name="username" />
<input type="password" name="password" />
<input type="submit"BfwOnclick="this.disabled=true; this.value='登录中...'; this.form.submit();" value="登录" />
</form>
2、函数节流
<script>或
// 时间戳函数节流方案
function throttle(fn,wait){
var pre = Date.now();
return function(){
var context = this;
var args = arguments;
var now = Date.now();
if( now - pre >= wait){
fn.apply(context,args);
pre = Date.now();
}
}
}
function handle(){
console.log(Math.random());
//ajax请求
}
throttle(handle,1000);//一秒内只能触发一次
</script>
<script>
// 定时器函数节流方案
function throttle(fn,wait){
var timer = null;
return function(){
var context = this;
var args = arguments;
if(!timer){
timer = setTimeout(function(){
fn.apply(context,args);
timer = null;
},wait)
}
}
}
function handle(){
console.log(Math.random());
//ajax请求
}
throttle(handle,1000);
</script>
3、form token
js产生一个form token值,执行完后,后端清空,第二次请求的时候就会报错,这样也达到了重复点击的目的
二、后端
后端可以通过锁或队列来进行处理,我们以php为例
<?php那么队列的话
/**
* 使用Memcache实现给进程加锁的类
*/
class MemLock {
private static $memcache = null;
/**
* 获取memcached连接
*
* @return Memcached
*/
public static function getConnection() {
if (! isset ( self::$memcache )) {
self::$memcache = new Memcache ();
self::$memcache->connect ( '127.0.0.1', 11211 );
}
return self::$memcache;
}
/**
* 加锁
*
* @param $key 锁关键字
* @param $expireTime 超时时间, 当进程在锁定后出错,这样永远不会释放锁了,只能等到缓存失效
*
* @return boolean true 成功获取到锁 false 获取锁失败
*/
public static function addLock($key, $expireTime = 120) {
$memcache = self::getConnection ();
if($memcache->add($key, 1, false, $expireTime)) {
return true;
}
return false;
}
/**
* 释放锁
*
* @param $key 锁关键字
*
* @return boolean true 释放成功 false 释放失败
*/
public static function releaseLock($key) {
$memcache = self::getConnection ();
return $memcache->delete ( $key );
}
$key = '锁键值';
if(MemLock::addLoack($key)) {
//处理
MemLock::releaseLock($key);
} else {
//不好意思,请求还没处理完
}
?>
入队列
<?php出队列
$redis = new Redis();
$redis->connect('127.0.0.1',6379);
while(True){
try{
$value = 'value_'.date('Y-m-d H:i:s');
$redis->LPUSH('key1',$value);
sleep(rand()%3);
echo $value."\n";
}catch(Exception $e){
echo $e->getMessage()."\n";
}
}
?>
<?php
$redis = new Redis();
$redis->pconnect('127.0.0.1',6379);
while(True){
try{
echo $redis->LPOP('key1')."\n";
}catch(Exception $e){
echo $e->getMessage()."\n";
}
sleep(rand()%3);
}
?>
网友回复