V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Registering
V2EX  ›  程序员

如何预防用户持续点击按钮导致高频度发生同一个 http 请求

  •  
  •   Registering · 2014-11-12 09:54:51 +08:00 · 3300 次点击
    这是一个创建于 3664 天前的主题,其中的信息可能已经有所发展或是发生改变。
    场景:
    android,社交工具
    同个界面中存在两个fragmentA和B,A中列出登陆用户加入的群组,每次用户能从A中选择一个群组,B中列出在A中选择查看的群组的成员列表。

    在A中点击某个群组之后,在B中列出该群组的成员列表时,每次都是从服务器端重新请求吗?那么如果在左侧,用户不停重复点击按钮,则重复的http请求在一直进行,这样问题大吗

    但是觉得每次发送http请求也有理,毕竟群组成员可能随时有新成员加入,或者旧成员更新头像昵称等。

    或者通过轮询,但是群组发生变更的检测场景过于繁杂。
    15 条回复    2014-11-13 10:47:28 +08:00
    abelyao
        1
    abelyao  
       2014-11-12 09:57:44 +08:00   ❤️ 1
    1、缓存;
    2、点击之后,直到数据加载完成之前,都把按钮的点击事件禁用了;
    3、可以网络抓包看看到底有没有走数据;
    Registering
        2
    Registering  
    OP
       2014-11-12 10:09:27 +08:00
    @abelyao
    1,缓存
    所有和图片相关的数据本地都适用缓存了
    2,数据加载完成之前,禁用按钮,
    谢谢提醒,这个很容易解决
    3,网络抓包
    这个不大懂,目前只知道轮询检测是否有数据更新(比如没20秒钟给服务器发一个轮询请求,检查是否有新数据)
    linKnowEasy
        3
    linKnowEasy  
       2014-11-12 10:12:54 +08:00
    问题 毕竟群组成员可能随时有新成员加入,或者旧成员更新头像昵称
    建议 你所说的问题 你可以提供一个刷新 的交互方式给他 而不是每次都刷新
    skydiver
        4
    skydiver  
       2014-11-12 10:19:56 +08:00 via Android
    就像按住F5一样,这种都是要处理的,要么加缓存保证能撑住,要么加频次限制
    Registering
        5
    Registering  
    OP
       2014-11-12 10:21:38 +08:00
    @linKnowEasy 那么在列表中加一个下拉刷新,这点也可以借鉴参考
    yanng
        6
    yanng  
       2014-11-12 10:55:39 +08:00 via iPhone
    加个遮罩层,服务器返回了再去掉。另外计算两次请求的时间间隔,太频繁的请求禁止。
    yjsslab
        7
    yjsslab  
       2014-11-12 10:59:21 +08:00
    hjc4869
        8
    hjc4869  
       2014-11-12 11:01:20 +08:00
    点击后禁用按钮。
    Registering
        9
    Registering  
    OP
       2014-11-12 11:01:53 +08:00
    @yjsslab 公司万恶的VPN
    xoxo
        10
    xoxo  
       2014-11-12 11:02:11 +08:00
    服务端限制
    Registering
        11
    Registering  
    OP
       2014-11-12 11:05:39 +08:00
    @xoxo 服务端限制,,那是请求已经发生之后的事情了,,,目的是避免多余请求
    xoxo
        12
    xoxo  
       2014-11-12 11:15:51 +08:00
    @Registering 那就前端限制
    tini8
        13
    tini8  
       2014-11-12 11:18:23 +08:00
    想多了
    jfengsky
        14
    jfengsky  
       2014-11-12 12:10:26 +08:00
    我的做法是在发请求前禁用按钮
    jsPop
        15
    jsPop  
       2014-11-13 10:47:28 +08:00
    前端控制:

    1 缓存:群组信息缓存在页面范围里,如果你是前端渲染的话最好,缓存数据即可。缓存设置一个ttl,过期就重新请求后端,在不用websocket保持同步的情况下,我觉得1分钟都没问题。缓存甚至可以保留数据在localStorage。
    当用户点击群组时,利用缓存立刻更新群组。这时有两种情况,数据过期与未过期。未过期就不用做额外处理。过期的话,在你的界面弄个小指示,表示现在在更新数据,然后往后台拿数据,拿到之后更新数据,刷新B。

    2 websocket push同步。详见 http://socket.io/
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2655 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 11:05 · PVG 19:05 · LAX 03:05 · JFK 06:05
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.