经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » Java » 查看文章
Redis限制一键登录次数
来源:cnblogs  作者:迷途者寻影而行  时间:2021/6/7 13:41:29  对本文有异议

一、产生背景

之前的随笔提到过项目中写了一键登录功能、上线后除了有时候网络波动会导致登陆失败,其他情况一直稳如老狗

image

しかし,邮件看到有人恶意刷一键登录,这年头闲的人可真闲啊,
只能思考如何搞一搞

image

二、解决思路

因为项目实现一键登录采用的是 自有服务器调用 所以限制一键登录分为两步走,因为每个手机号有唯一的openid所以拿openid做redis的key值

(1)、调用云函数之前

调用云函数之前,前端会发起请求给后台,拿到这个请求后去 Redis 中检查2小时的登录次数如果大于设定阈值就返回限制一键登录次数,否则就放行通过

(2)、调用云函数

调用时使用Redis的 setNX()(命令在指定的 key 不存在时,为 key 设置指定的值,这种情况下等同 SET 命令。当 key存在时,什么也不做。)因为第一次不存在key所以设置一个初始值和过期时间。接下来使用Redis的 incrBy() 使value自增,每次调用value就+1。

三、上手编码

(1)、调用云函数前编码

  1. public static void checkOneLogin(String openid) {
  2. if (StringUtils.isBlank(openid)) {
  3. "参数校验,抛出自定义异常即可";
  4. }
  5. //从Redis获取该用户半小时内登录次数
  6. String s = RedisHelper.get(RedisHelper.get(openid));
  7. //如果为空直接返回
  8. if (StringUtils.isBlank(s)){
  9. return;
  10. }
  11. //如果redis存储OpenId并且 value大于10抛出异常
  12. if (Integer.parseInt(s) >= 10) {
  13. log.info("[日志]用户{}在{}因一键登录次数过多,被暂时禁止一键登录",openid,new Date());
  14. "记录日志,抛出异常";
  15. }
  16. }

(2)、调用云函数编码

  1. public static void oneLoginOK(String openid) {
  2. //首次进入赋予默认值
  3. boolean nx = RedisHelper.setNx(RedisHelper.get(openid), "1", 60 * 30);
  4. //首次进入返回
  5. if (nx) {
  6. return;
  7. }
  8. //登录成功自增1
  9. Long incr = RedisHelper.incrBy(RedisHelper.get(openid));
  10. if (incr >= 10) {
  11. //设置过期时间
  12. RedisHelper.expire(RedisHelper.get(openid), 60 * 60 * 2);
  13. }
  14. }

写的不是很规范,实际开发要加Redis头等 总的来说遇到的问题也不老少,还有云函数内存不够的情况、、网络稍有问题也会出现问题~~~

image

原文链接:http://www.cnblogs.com/pkkyh/p/14858364.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号