最近做一些东西,需要前后端协调,遇到一个问题是表单提交中,某个字段我们需要确保它是唯一的,比如注册时的用户名字段username
。
1.前端
我选择用ajax
来向后端校验username
的唯一性。绑定了输入框的blur
事件,当输入框失去焦点时校验。
$('#username').blur(function () {
$.getJson('',{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ㄒ)/~~哎呀,服务器有问题了,请刷新后再试试");
}
});