复提交锁定Redis,避免重复提交(redis锁防重)
复提交锁定Redis技术是一种常用的用于避免用户多次提交的技术。它的主要思路是:在用户点击或提交表单操作时,生成一个唯一的token,并将token与当前用户的标识(例如用户id)一起存储到Redis中。提交表单操作时,先到Redis中验证当前请求是否合法,如果Redis中存在该token说明该用户已提交过一次,可直接拒绝此次提交,避免重复提交,否则继续执行后续操作。
“`Java
String token = UUID.randomUUID().toString();
//将token和用户信息存入redis中,存储时间300s
redisTemplate.opsForValue().set(token, userId,300,TimeUnit.SECONDS);
//将token值返回给前端
return token;
““
在前端页面,我们可以在表单的action中添加token参数,并将上述返回的token值传递给后端。
“`Java
//前端构建提交表单
form.action = “/commit?token=” + token
““
随后我们向后台发起请求,此时后台要从Redis中获取token值进行验证:
“`Java
//不存在或已过期,返回本次请求非法
String userId = redisTemplate.opsForValue().get(token);
if (Objects.isNull(userId)) {
//本次请求非法
}
““
如果Redis中存在该token,表明用户已经成功提交过一次,再次遭遇提交可能是由于用户点击多次,也可能是攻击者企图重放攻击,这时我们可以根据业务需求考虑是返回提醒信息还是返回本次请求非法,以避免重复提交造成资源浪费和重复操作等麻烦。
复提交锁定Redis技术用于避免用户重复提交场景还是很有效的,原理简单易懂,代码实现起来也比较方便,可以有效的避免重复提交的问题,也能大大提升用户体验。