前端的无良(粗口)操作行为很容易给后台制造脏数据,这样就需要我们后台做一些校验和防重操作,如下是产生脏数据的几种方式:
1、用户点击过快,重复提交两次。
2、网络延时,用户刷新或者点击下单重复提交。
3、网络框架重复请求,某些网络框架,在延时比较高的情况下会自动重复请求。
4、用户恶意行为。
解决办法
在前端拦截,点击后按钮置灰,不能继续点击,防止用户,连续点击造成的重复下单。
在下单前获取一个下单的唯一token,下单的时候需要这个token。后台系统校验这个 token是否有效,才继续进行下单操作。
下面我说下后台防重做法,直接上代码
/**
* 先生成 token 保存到 Redis
* token 作为 key , 并设置过期时间 时间长度 根据任务需求
* value 为数字 自增判断 是否使用过
*
* @param user
* @return
*/
public String createToken(User user) {
String key = "placeOrder:token:" + user.getId();
String token = UUID.randomUUID().toString();
//保存到Redis
redisService.set(key + token, 0, 1000L);
return token;
}
/**
* 校验下单的token是否有效
* @param user
* @param token
* @return
*/
public boolean checkToken(User user, String token) {
String key = "placeOrder:token:" + user.getId();
if (null != redisService.get(key + token)) {
long times = redisService.increment(key + token, 1);
if (times == 1) {
//利用increment 原子性 判断是否 该token 是否使用
return true;
} else {
// 已经使用过了
}
//删除
redisService.remove(key + token);
}
return false;
}
这是一个简单容易的做法,就是每次前端请求生成token,请求接口需要携带token,后台再前端操作前可以先校验token是否有效。
我们可以通过注解的方式,对指定一些请求方法加校验,具体实现大家可以自己百度自定义注解和实现方式。