Skip to content

架构中的数据校验与处理

最近做一些东西,需要前后端协调,遇到一个问题是表单提交中,某个字段我们需要确保它是唯一的,比如注册时的用户名字段username

1.前端
我选择用ajax来向后端校验username的唯一性。绑定了输入框的blur事件,当输入框失去焦点时校验。

$('#username').blur(function () {
    $.getJson('url',{username:$('#username').val()},function(response){
        //如果不唯一,提示,并禁止表单提交
    });
});

2.后端
防御式编程核心思想就是”假设输入都是非法的”。这个思想在前后端编程中尤其重要,你永远不要相信网络那头传过来的数据。所以当用户提交表单时,我们需要在后端同样对数据校验,在校验username的唯一性时,我将所有的username作为List放在redis中。
尤其是在前端ajax校验时,会有大量请求,使用redis可以提高效率,减少数据库负担。

public boolean uniqueUserName(String username) {
    List<String> usernames = Redis.use().lrange("usernames",0,-1);
    return usernames == null || !usernames.contains(username) ;
}

3.数据库
在并发的可能性下,数据库可以作为我们最后一道防线,非常稳固。我在数据库用户表中,为username字段建立的unique索引。保证字段唯一性。

ALTER TABLE `user`
ADD UNIQUE INDEX `username` (`username`) ;

综上所述,即使构建一个小工程,也要缜密思考并详细设计每一个环节和流程,在工程架构的每一层都需要有独立处理数据的能力,又要联系上下游的数据传递和错误处理。

后续:当我测试Mysql的唯一索引这层保障时,发现抛出异常,因为后端配置了500页面,返回消息实体是页面,然而前端用的ajax请求,并不能解析消息,也不能直接跳转。所以错误处理和数据传递出现了问题。后来发现了jquery可以配置全局ajax错误处理函数,十分方便,之后无论前端跳转请求还是ajax请求,后端如果发生异常,都可以处理。

$.ajaxSetup({
    error: function () {
        alert('/(ㄒoㄒ)/~~哎呀,服务器有问题了,请刷新后再试试');
    }
});
Published inService

Be First to Comment

发表评论

电子邮件地址不会被公开。 必填项已用*标注