素材牛VIP会员
注册时同一个用户注册多回,数据库中也出现多条一样的数据,后台已经进行了校验,前台js也限制了两秒提交一次,但是还是会出现多条
 xi***iu  分类:Java代码  人气:1760  回帖:14  发布于6年前 收藏

注册时同一个用户注册多回,数据库中也出现多条一样的数据,后台已经进行了校验,前台js也限制了两秒提交一次,但是还是会出现多条

讨论这个帖子(14)垃圾回帖将一律封号处理……

Lv5 码农
龙***4 页面重构设计 6年前#1

你这问题 你确定前端控制有效? 你确定后端控制有效? 都有效果的话 根本不可能出现这种情况

Lv7 码师
to***09 PHP开发工程师 6年前#2

参考我的文章Web项目如何防止客户端重复发送请求

Lv2 入门
黑***s 页面重构设计 6年前#3

解决方案:

1、前端按钮触发后禁用, 直到服务器返回数据

2、数据库添加主键唯一检验

Lv5 码农
黑***黑 Web前端工程师 6年前#4

数据库中用唯一索引作限制

Lv3 码奴
lo***ng PHP开发工程师 6年前#5

1,并发控制
2,数据库表中账号加约束
3,注册时做账号唯一性校验
4,检查一下你的2s控制,或点击注册后可禁用按钮

Lv3 码奴
gu***di 软件测试工程师 6年前#6

服务端校验需要作唯一性的判断;前端按钮点击后禁止点击,等待服务端返回后解除禁止点击,或者通过超时方式来实现

Lv5 码农
青***1 JAVA开发工程师 6年前#7

不知道你是用debouce还是throttle限制两秒提交的

比较好的做法是点击注册把按钮禁用掉,等请求返回再在回调函数启用按钮,记得报错的回调也要启用注册按钮

后端数据库字段也要做唯一索引

Lv7 码师
雪***狐 职业无 6年前#8

数据库加用户名主键唯一验证呀

Lv5 码农
雷***g 学生 6年前#9

前端控制:

var isSubmitting = false;
if(!isSubmitting){
    $.ajax({
        type: "post",
        data: {uuid:uuid, other:data},//uuid在注册页面加载时由后端生成
        contentType: "application/json",
        url: "/caiyongji.com/submit",
        beforeSend: function () {
            //变量控制(js角度)
            isSubmitting = true;
            // 禁用按钮(browser角度,可能出现延迟)
            $("#submit").attr({ disabled: "disabled" });
        },
        success: function (data) {
            //成功
        },
        complete: function () {
            $("#submit").removeAttr("disabled");
            isSubmitting = false;
        }
    });
}

后端控制:

    //手头没缓存组件,简易写一个
    private static ConcurrentMap<String, String> cache = new ConcurrentHashMap<>();
    public void preventDuplicateSubmit(String uuid, Object other){
        if (StringUtils.isEmpty(cache.get("uuid"))) {
            cache.put("uuid", uuid)
            //继续
        }else{
            return;
        }
    }
Lv4 码徒
这***3 站长 6年前#10

前端禁用按钮的方案虽然也是必需的,但是这个仅仅只是避免普通用户多次点击而已,不能阻止非浏览器的‘用户’
不管服务器接受了多少次重复的请求,必须后端进行处理
目的是同一个用户只能注册一次,参考其他回答,主键

上一页12下一页
 文明上网,理性发言!   😉 阿里云幸运券,戳我领取