开发者社区> 问答> 正文

前端快速点击重复请求,后端如何控制第一次请求结束才能进行第二次请求 400 请求报错 

请教个问题    后端怎么防止   APP操作某个功能 快速点击  造成重复请求 

就是第一次还没结束 就发第二次请求  就重复了  

怎么才能让第一次请求结束才能请求第二次

展开
收起
kun坤 2020-05-30 17:26:51 2041 0
1 条回答
写回答
取消 提交回答
  • 点击后disabled掉,回调回来再重置回来######前端不限制?######我觉得这个还是前端做限制会比较合适,如果后端的 话  我暂时想到的就是ip过滤  每个IP在指定的时间内只能访问几次    不过感觉这样有点浪费资源###### 需要前后端一起限制
    1.前端限制,点击后disabled掉,回调回来或者超时再重置回来
    2.后端,限制用户只能在一定时间内访问该接口一次,可以借助redis的字符串的类型的SETNX 命令。 请求进入在redis中计数,后续请求直接返回,查询redis有值就返回失败,处理完毕删除redis的值 ######这个怎么限制在一定时间内哪?######你的问题有两种理解方式 第一种:用户点击N次 然后后台排队按照点击次数,一次一次的执行;第二种:用户点击n次,只执行第一次点击,其余的都不执行; 如果是第二种:你只需要在后台设置一个变量 用这个值做判断就行了  后台在执行点击指令时 把他的值修改  防止第二次点击命令进来,然后执行完成后将值恢复。至于第一种 我对java没什么了解 但是我觉得应该可以利用类似列队的方式来解决######1.后台加锁机制 2.点击之后设置为disable,等到请求结束返回信息再设置为disable,

    ######后端可以编码限定请求频率,例如Guava的RateLimiter。或者通过Ngnix限制###### 加一个过滤器,每次请求到的时候给 session 里面设置一个时间戳,返回的时候 removeSession 中这个值,如果第二个请求来了判断 session 里面时间戳是否满足了时间间隔,如果不满足,就直接返回一个提示,提交太频繁 ######刚看是 app,这样的话就直接记录针对设备或账号设置一个最后请求的时间戳,然后对比,一样的道理,完全可以放内存里面,每次只为一个账号保留一个时间戳就行了,也用不了多大内存######我遇到这种问题都是最简单的方法, 存session个值, 当然一个用户换个浏览器就不好用了, 或者缓存 用户名和状态, 主要还是要前台限制, 如果是定时操作, 可以用settimeout代替用户操作######突然想到  每次请求返回一个只能使用一次的随机值  处理请求前先比对该值  不知道行不行

    2020-05-30 17:26:57
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
Vue.js 在前端服务化上的探索与实践 立即下载
阿里文娱大前端技术实践 立即下载
前端代码是怎样智能生成的 立即下载