使用redis记录登录次数防止暴力破解

刺骨的言语ヽ痛彻心扉 2021-10-09 08:34 658阅读 0赞

redis API介绍

  1. //向redis里存入数据和设置缓存时间
  2. stringRedisTemplate.opsForValue().set("baike", "100", 60 * 10, TimeUnit.SECONDS);
  3. //val做-1操作
  4. stringRedisTemplate.boundValueOps("baike").increment(-1);
  5. //根据key获取缓存中的val
  6. stringRedisTemplate.opsForValue().get("baike")
  7. //val +1
  8. stringRedisTemplate.boundValueOps("baike").increment(1);
  9. //根据key获取过期时间
  10. stringRedisTemplate.getExpire("baike");
  11. //根据key获取过期时间并换算成指定单位
  12. stringRedisTemplate.getExpire("baike",TimeUnit.SECONDS);
  13. //根据key删除缓存
  14. stringRedisTemplate.delete("baike");
  15. //检查key是否存在,返回boolean值
  16. stringRedisTemplate.hasKey("baike");
  17. //向指定key中存放set集合
  18. stringRedisTemplate.opsForSet().add("baike", "1","2","3");
  19. //设置过期时间
  20. stringRedisTemplate.expire("baike",1000 , TimeUnit.MILLISECONDS);
  21. //根据key查看集合中是否存在指定数据
  22. stringRedisTemplate.opsForSet().isMember("baike", "1");
  23. //根据key获取set集合
  24. stringRedisTemplate.opsForSet().members("baike");
  25. //验证有效时间
  26. Long expire = redisTemplate.boundHashOps("baike").getExpire();
  27. System.out.println("redis有效时间:"+expire+"S");

场景:登录接口登录3次后不让其再次去数据库中查询数据,直接返回友好提示,待5分钟后再试

代码实现

  1. @Autowired
  2. private JdbcTemplate jdbcTemplate;
  3. @Autowired
  4. private StringRedisTemplate redisTemplate;
  5. // 验证用户信息
  6. public Object checkUser(String username, String password) {
  7. // 查询登录的错误次数
  8. String value0 = redisTemplate.opsForValue().get(username);
  9. try {
  10. if (value0 != null && Integer.valueOf(value0) > 2) {
  11. // 登录错误次数超过3次后,直接返回错误提示,不走数据库。防止人为错误5分钟key值过期
  12. redisTemplate.opsForValue().set(username, "3", 60 * 5, TimeUnit.SECONDS);
  13. return new RRException(RongRunErrorCodeEnum.LANDED_THREE_ERROR).getCodeMsg();
  14. }
  15. long i = 0;
  16. String sql2 = "select * from user_info where username= ? and password =? ";
  17. String sql3 = "select count(id) as num from user_info where username=? and password=?";
  18. System.err.println("sql3:" + sql3);
  19. List<Map<String, Object>> queryForList2 = jdbcTemplate.queryForList(sql3, username, password);
  20. for (Map<String, Object> map : queryForList2) {
  21. System.out.println(map.get("num"));
  22. i = (long) map.get("num");
  23. }
  24. if (i == 1L) {
  25. List<Map<String, Object>> queryForList = jdbcTemplate.queryForList(sql2, username, password);
  26. return queryForList;
  27. }
  28. } catch (Exception e) {
  29. // 系统异常的提示
  30. return new RRException(RongRunErrorCodeEnum.SYSTEM_ERROR).getCodeMsg();
  31. }
  32. if (value0 == null) {
  33. // 记录登录次数
  34. redisTemplate.opsForValue().set(username, "1", 60 * 5 * 60, TimeUnit.SECONDS);
  35. } else {
  36. // 累加登录次数
  37. redisTemplate.boundValueOps(username).increment(1);
  38. }
  39. // 登录失败提示
  40. return new RRException(RongRunErrorCodeEnum.LOGIN_FAILED).getCodeMsg();
  41. }

异常枚举类

  1. package com.cennavi.vehicle_networking_data.utils;
  2. import java.util.HashMap;
  3. import com.alibaba.fastjson.JSONObject;
  4. /**
  5. * @Description: 错误枚举类
  6. * @Param:
  7. * @return:
  8. * @Author: ywj
  9. * @Date: 2019/5/21 0021
  10. */
  11. public enum RongRunErrorCodeEnum {
  12. /**
  13. * 成功状态码
  14. */
  15. SUCCESS(0, "成功"),
  16. /**
  17. * 参数为空
  18. */
  19. PARAM_EMPTY(1, "参数为空"),
  20. /**
  21. * 获取openid为空
  22. */
  23. OPENID_IS_EMPTY(2, "获取openid为空"),
  24. /**
  25. * 登录失败
  26. */
  27. LOGIN_FAILED(3, "登录失败"),
  28. /**
  29. * openid未绑定
  30. */
  31. OPENID_NOT_BIND(4, "openid未绑定"),
  32. /**
  33. * 密码错误
  34. */
  35. WRONG_PASSWORD(5, "密码错误"),
  36. /**
  37. * 账号不存在
  38. */
  39. ACCOUNT_NOT_EXIST(6, "帐号不存在"),
  40. /**
  41. * 用户在该系统没有权限
  42. */
  43. ACCOUN_NO_AUTHORITY(7, "用户在该系统没有权限"),
  44. /**
  45. * base64编码为空
  46. */
  47. BASE64_IS_EMPTY(8, "base64编码为空"),
  48. /**
  49. * 图片识别类型为空
  50. */
  51. RECOGNITION_TYPE_EMPTY(9, "图片识别类型为空"),
  52. /**
  53. * 调用接口失败
  54. */
  55. CALL_INT_FAIL(10, "调用接口失败"),
  56. /**
  57. * 获取权限信息失败
  58. */
  59. GET_QX_FAIL(11, "获取权限信息失败"),
  60. /**
  61. * 获取信息不存在
  62. */
  63. PARAM_NOT_EXIST(12, "获取信息不存在"),
  64. /**
  65. * 文件类型异常
  66. */
  67. FILE_TYPE_ERROT(13, "不是我们想要的文件类型,请按要求重新上传"),
  68. /**
  69. * 包含数据删除异常
  70. */
  71. CARGROUP_CONTAINS_ERROT(14, "该车组下包含有车辆无法删除"),
  72. /**
  73. *车组 重名异常
  74. */
  75. CARGROUP_DUPLICATE_NAME(14, "该名称业务组下已存在"),
  76. /**
  77. * 新增绑定异常
  78. */
  79. VEHICLE_ADD_ERROR(15, "新增成功,该车未绑定无法进行激活操作"),
  80. /**
  81. * 新增绑定异常
  82. */
  83. VEHICLE_UPDATE_ERROR(16, "修改成功,该车未绑定无法进行激活操作"),
  84. /**
  85. * 新增绑定异常
  86. */
  87. VEHICLE_ACTIVATION_ERROR(17, "操作失败,含有未绑定的车辆无法激活"),
  88. /**
  89. * 车辆信息重名异常
  90. */
  91. VEHICLE_DUPLICATE_NAME(18, "该车已存在"),
  92. /**
  93. *车组 重名异常
  94. */
  95. FENCE_DUPLICATE_NAME(19, "相同业务组下该名称已存在"),
  96. /**
  97. *登陆3次错误
  98. */
  99. LANDED_THREE_ERROR(20, "您已经登陆错误超过三次,请5分钟后再次登陆谢谢"),
  100. /**
  101. * 系统异常
  102. */
  103. SYSTEM_ERROR(500, "系统异常");
  104. /**
  105. * 状态码
  106. */
  107. private Integer code;
  108. /**
  109. * 异常信息
  110. */
  111. private String msg;
  112. /**
  113. * 异常枚举信息
  114. *
  115. * @param code 状态码
  116. * @param msg 信息
  117. */
  118. RongRunErrorCodeEnum(Integer code, String msg) {
  119. this.code = code;
  120. this.msg = msg;
  121. }
  122. /**
  123. * 获取状态码
  124. *
  125. * @return
  126. */
  127. public Integer getCode() {
  128. return code;
  129. }
  130. /**
  131. * 获取信息
  132. *
  133. * @return
  134. */
  135. public String getMsg() {
  136. return msg;
  137. }
  138. /**
  139. *重写toString方法在控制台显示自定义异常信息
  140. * @return
  141. */
  142. @Override
  143. public String toString() {
  144. String str="[errorCode:"+this.code+" errorMsg:"+this.msg+"]";
  145. return str;
  146. }
  147. }

发表评论

表情:
评论列表 (有 0 条评论,658人围观)

还没有评论,来说两句吧...

相关阅读

    相关 使用ELK实时分析SSH暴力

    这是ELK入门到实践系列的第二篇文章,分享如何使用ELK实时分析SSH暴力破解。从一张图看出SSH登录时间、登录状态、用户名字典,尝试次数、来源IP等,可洞悉SSH暴力破解,迅

    相关 linux 防止ssh暴力的方法

    上两个星期发生了一件事情,让我感觉到安全是多么的重要,因为租了一天学生机Linux作为服务器,没想到用了没两个月就出现问题了。给外国黑客ssh暴力破解,然后安装挖矿病毒,导致c