如何防止用户大量使用同一用户名恶意攻击?
在数据库层兜底
使用redisson分布式锁
当用户第一次在毫秒级别使用大量的请求去注册 由于布隆过滤器中还没没有缓存这些数据
大量请求打在数据库上可能会造成数据库宕机
因此可以使用reddison分布式锁来保证只有一个请求能够被接受 多余的请求全部打回
代码实现:
1.定义锁的前缀名
@Overridepublic void register(UserRegisterReqDTO requestParam) {if (!hasUserName(requestParam.getUsername())){throw new ClientException(USER_NAME_EXIST);}RLock lock = redissonClient.getLock(RedisCacheConstant.LOCK_USER_REGISTER_KEY + requestParam.getUsername());try{if (lock.tryLock()){int inserted = baseMapper.insert(BeanUtil.toBean(requestParam, UserDO.class));/*** 这里进行了两步的操作 一是直接写入数据库 二是写入布隆过滤器缓存*/if (inserted < 1) {throw new ClientException(USER_SAVE_ERROR);}userRegisterCachePenetrationBloomFilter.add(requestParam.getUsername());}throw new ClientException(USER_NAME_EXIST);} finally {lock.unlock();}}