分前端和后端
一、前端
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);
}
?>
网友回复
有没有让本地开源大模型越狱的方法或插件啥的?
如何使用Zero Trust的Tunnels技术将局域网电脑web服务可以公网访问呢?
编程领域ai大模型的排名是怎么样的?
如何修改别人发给我的微信笔记内容?
fbx、obj、glb三维格式模型如何在浏览器中通过three相互转换格式?
python如何实现基于http隧道加密的正向代理服务?
有没有有专门针对 UI 界面截图进行智能标记(Set-of-Mark, SoM) 的开源库和工具?
如何用python实现Set-of-Mark (SoM) 技术?
python如何截取windows指定应用的窗口截图,不用管窗口是不是在最前面?
linux能不能给rm删除命令增加回收站功能,可恢复被删文件?


