【问题标题】:prevent user from refreshing a page multiple times防止用户多次刷新页面
【发布时间】:2015-05-22 21:02:41
【问题描述】:

当用户按住 F5 10-15 分钟时,我遇到了一个问题,网页变得无响应,最后 IIS 抛出错误。

为了解决这个问题,我想限制用户在一定次数后按 F5(锁定 F5 事件)。一段时间后,比如 5 分钟,我想启用刷新功能(解锁 F5 事件)。

我正在使用 cookie 来保存用户按 F5 的次数。为了处理 cookie,我使用了提到的代码 here

分配一个事件来检查 F5 是否按下。

$(document).on("keydown", tryingF5);

我正在使用一个变量来保存 cookie 值并在用户按下 F5 后递增它。

var numberOfF5Click = 1;
var thresholdClick = 10;
var numberOfF5Click = 1;
function tryingF5(e) {
        if ((e.which || e.keyCode) == 116) {
            //alert(numberOfF5Click);
            if (numberOfF5Click > thresholdClick) {
                e.preventDefault();
                alert("Multiple refresh has been prevented for some time!!");
            }

            numberOfF5Click = numberOfF5Click + 1;
            docCookies.setItem("NumberOfF5Click", numberOfF5Click);

            //alert("F5 Clicked =" + numberOfF5Click);
        };
    };

完整的代码在这里设置:JSBin

问题:代码没有按预期工作,有问题,我怎样才能做得更好?

【问题讨论】:

  • 嘿嘿……这是真的吗? ;) 如果用户愿意花 15 分钟刷新页面,网站崩溃是不是不能接受?
  • 您是否尝试找出可能导致您的网页崩溃的原因?
  • 你可以使用会话吗?如果可以,请使用一个会话变量来计算已完成的刷新次数,然后在您的第一行代码中:if (counter > limit) die();。用户可以做F5,但是服务器不会花时间在他身上。
  • brianvaughn 和@chikamtsu :你有非常有效的建议。我花了1天的时间来分析这个问题。这些更改需要一周的时间进行优化,我被要求进行这种肮脏的修复。有时,高层管理人员只关注收入而不了解真正的问题。
  • 好吧,假设这不是一个假设的问题,那是用户对 DOS 的微不足道的尝试。 js 是错误的解决方案,禁用 js -> 没有任何变化。你应该做的是速率限制,或者使用fail2ban或类似的。

标签: javascript jquery internet-explorer cookies


【解决方案1】:

试试这个:

var everyXMinutes = 5 * 1000; // 5 seconds
var maxPerEveryXMinutes = 5; // 5 times per x seconds.

document.onkeydown = function (e) {
    if (e.keyCode === 116) {
        if (!localStorage.refreshments) {
            localStorage.refreshments = JSON.stringify([]);
        }
        var refreshments = JSON.parse(localStorage.refreshments);
        var date = new Date();
        if (date.getTime() - refreshments[refreshments.length - 1] >= everyXMinutes) {
            refreshments = [];
        } else if (refreshments.length >= maxPerEveryXMinutes) {
            alert("You must wait " + ((everyXMinutes - (date.getTime() - refreshments[refreshments.length - 1])) / 1000) + "s in order to be able to use the refresh function.");
            return false;
        }            
        refreshments.push(date.getTime());
        localStorage.refreshments = JSON.stringify(refreshments);
    }
};

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-21
    • 1970-01-01
    • 1970-01-01
    • 2013-12-25
    • 1970-01-01
    • 1970-01-01
    • 2017-03-14
    相关资源
    最近更新 更多