使⽤redis记录登录次数防⽌暴⼒破解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获取过期时间
/
/根据key获取过期时间并换算成指定单位
//根据key删除缓存
stringRedisTemplate.delete("baike");
//检查key是否存在,返回boolean值
stringRedisTemplate.hasKey("baike");
//向指定key中存放set集合
stringRedisTemplate.opsForSet().add("baike", "1","2","3");
//设置过期时间
//根据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=?";
List<Map<String, Object>> queryForList2 = jdbcTemplate.queryForList(sql3, username, password);
for (Map<String, Object> map : queryForList2) {
System.out.("num"));
i = (long) ("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();
}
异常枚举类
avi.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.msg = msg;
}
/**
* 获取状态码
*
* @return
*/
public Integer getCode() {
return code;
}
/**
* 获取信息
*
* @return
*/
public String getMsg() {
return msg;
}
/**
*重写toString⽅法在控制台显⽰⾃定义异常信息
* @return
*/
jdbctemplate查询一条数据@Override
public String toString() {
String str="[errorCode:"+de+" errorMsg:"+this.msg+"]"; return str;
}
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论