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

2022-09-17 12:59:25

redis API介绍

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

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

代码实现

	@Autowired
	private JdbcTemplate jdbcTemplate;
	@Autowired
	private StringRedisTemplate redisTemplate;
// 验证用户信息
	public Object checkUser(String username, String password) {
	
		// 查询登录的错误次数
		String value0 = redisTemplate.opsForValue().get(username);
		try {
			if (value0 != null && Integer.valueOf(value0) > 2) {
				// 登录错误次数超过3次后,直接返回错误提示,不走数据库。防止人为错误5分钟key值过期
				redisTemplate.opsForValue().set(username, "3", 60 * 5, TimeUnit.SECONDS);
				return new RRException(RongRunErrorCodeEnum.LANDED_THREE_ERROR).getCodeMsg();
			}
			long i = 0;
			String sql2 = "select * from  user_info  where username= ? and password =? ";
			String sql3 = "select count(id) as num from  user_info  where username=? 	and password=?";
			System.err.println("sql3:" + sql3);

			List<Map<String, Object>> queryForList2 = jdbcTemplate.queryForList(sql3, username, password);

			for (Map<String, Object> map : queryForList2) {
				System.out.println(map.get("num"));
				i = (long) map.get("num");
			}

			if (i == 1L) {
				List<Map<String, Object>> queryForList = jdbcTemplate.queryForList(sql2, username, password);
				return queryForList;
			}
		} catch (Exception e) {
			// 系统异常的提示
			return new RRException(RongRunErrorCodeEnum.SYSTEM_ERROR).getCodeMsg();
		}

		if (value0 == null) {
			// 记录登录次数
			redisTemplate.opsForValue().set(username, "1", 60 * 5 * 60, TimeUnit.SECONDS);
		} else {
			// 累加登录次数
			redisTemplate.boundValueOps(username).increment(1);
		}
		// 登录失败提示
		return new RRException(RongRunErrorCodeEnum.LOGIN_FAILED).getCodeMsg();

	}

异常枚举类

package com.cennavi.vehicle_networking_data.utils;

import java.util.HashMap;

import com.alibaba.fastjson.JSONObject;

/**
 * @Description: 错误枚举类
 * @Param:
 * @return:
 * @Author: ywj
 * @Date: 2019/5/21 0021
 */
public enum RongRunErrorCodeEnum {
    /**
     * 成功状态码
     */
    SUCCESS(0, "成功"),
    /**
     * 参数为空
     */
    PARAM_EMPTY(1, "参数为空"),
    /**
     * 获取openid为空
     */
    OPENID_IS_EMPTY(2, "获取openid为空"),
    /**
     * 登录失败
     */
    LOGIN_FAILED(3, "登录失败"),
    /**
     * openid未绑定
     */
    OPENID_NOT_BIND(4, "openid未绑定"),
    /**
     * 密码错误
     */
    WRONG_PASSWORD(5, "密码错误"),
    /**
     * 账号不存在
     */
    ACCOUNT_NOT_EXIST(6, "帐号不存在"),
    /**
     * 用户在该系统没有权限
     */
    ACCOUN_NO_AUTHORITY(7, "用户在该系统没有权限"),
    /**
     * base64编码为空
     */
    BASE64_IS_EMPTY(8, "base64编码为空"),
    /**
     * 图片识别类型为空
     */
    RECOGNITION_TYPE_EMPTY(9, "图片识别类型为空"),
    /**
     * 调用接口失败
     */
    CALL_INT_FAIL(10, "调用接口失败"),
    /**
     * 获取权限信息失败
     */
    GET_QX_FAIL(11, "获取权限信息失败"),
    /**
     * 获取信息不存在
     */
    PARAM_NOT_EXIST(12, "获取信息不存在"),
    
    /**
     * 文件类型异常
     */
  
    FILE_TYPE_ERROT(13, "不是我们想要的文件类型,请按要求重新上传"),
    
    
    /**
     * 包含数据删除异常
     */
   
    
    CARGROUP_CONTAINS_ERROT(14, "该车组下包含有车辆无法删除"),
    
    
    /**
     *车组 重名异常
     */
    
    CARGROUP_DUPLICATE_NAME(14, "该名称业务组下已存在"),
    /**
     * 新增绑定异常
     */
    
     
    
    
    VEHICLE_ADD_ERROR(15, "新增成功,该车未绑定无法进行激活操作"),
    
    /**
     * 新增绑定异常
     */


    VEHICLE_UPDATE_ERROR(16, "修改成功,该车未绑定无法进行激活操作"),
    
    /**
     * 新增绑定异常
     */
    
    VEHICLE_ACTIVATION_ERROR(17, "操作失败,含有未绑定的车辆无法激活"),
    
    
    /**
     * 车辆信息重名异常
     */
    
    VEHICLE_DUPLICATE_NAME(18, "该车已存在"),
    
    
    /**
     *车组 重名异常
     */
    
    FENCE_DUPLICATE_NAME(19, "相同业务组下该名称已存在"),
    /**
     *登陆3次错误
     */
    
    LANDED_THREE_ERROR(20, "您已经登陆错误超过三次,请5分钟后再次登陆谢谢"),
    
    
 
    /**
     * 系统异常
     */
    
    
    SYSTEM_ERROR(500, "系统异常");
	
	
    /**
     * 状态码
     */
    private Integer code;
    /**
     * 异常信息
     */
    private String msg;
 
    /**
     * 异常枚举信息
     *
     * @param code 状态码
     * @param msg  信息
     */
    RongRunErrorCodeEnum(Integer code, String msg) {
        this.code = code;
        this.msg = msg;
    }
 
    /**
     * 获取状态码
     *
     * @return
     */
    public Integer getCode() {
        return code;
    }
 
    /**
     * 获取信息
     *
     * @return
     */
    public String getMsg() {
        return msg;
    }
 
 
    /**
     *重写toString方法在控制台显示自定义异常信息
     * @return
     */
    @Override
    public String toString() {
    	String str="[errorCode:"+this.code+" errorMsg:"+this.msg+"]";
        return str;
    }
}
  • 作者:佳佳乐2503
  • 原文链接:https://blog.csdn.net/qq_33355858/article/details/104699438
    更新时间:2022-09-17 12:59:25