实现登录限制
后端新手,借助数据库实现了这么一个功能。具体实现思路如下:
验证用户输错密码次数,记录错误次数
,当次数超过规定数字后,给该账户设置锁定状态
,并设置锁定时间
(当天的24点)
这样当用户每次登陆的时候先验证下是否锁定,再处理其他业务
解锁的方法比较简单,当用户再次登录时,用当前时间
去和锁定
状态下的锁定时间
进行比对,大于锁定时间
就进行解锁,并重置锁定时间为null
,锁定状态
在原有的user
表新增字段
lock_status
: 账户锁定状态 默认0未锁定 1已锁定lock_time
: 记录锁定截止时间 默认nullerror_num
: 记录密码验证错误次数 默认0lock_num
: 允许的错误次数(默认5),这里写在数据库里是为了后期方便修改,而没有写在代码里@Data
public class UserDO {
private int id;
private String username;
@JSONField(serialize = false)
private String password;
private int lock_status;
private Timestamp lock_time;
}
@Mapper
public interface LoginMapper {
UserDO login(Map params);
void setLockNum(Map params);
void setLockTime(Map params);
UserDO getLockStatus(Map params);
void resetLockStatus(Map params);
}
public interface LoginService {
Result login(Map params);
}
public class LoginServiceImpl implements LoginService {
@Autowired
LoginMapper loginMapper;
@Override
public Result login(Map params) {
UserDO res = loginMapper.login(params);
UserDO lockStatus = loginMapper.getLockStatus(params);
if(lockStatus!=null && lockStatus.getLock_status()==1){
Date date = new Date();
if(lockStatus.getLock_time() == null){
System.out.println("--------?????----------");
System.out.println("锁定时间为空,设置锁定时间");
System.out.println("--------?????----------");
loginMapper.setLockTime(params);
}else{
if(date.getTime() > lockStatus.getLock_time().getTime()){
System.out.println("-------??????????-----------");
System.out.println("锁定时间失效,清空锁定状态");
System.out.println("-------??????????-----------");
loginMapper.resetLockStatus(params);
UserDO freshmen = loginMapper.login(params);
return allResult(params, freshmen);
} else {
System.out.println("-------??????????-----------");
System.out.println("锁定状态中");
System.out.println("-------??????????-----------");
}
}
String time = UtilFun.formatTime("yyyy年MM月dd日").format(date);
return new Result(false, 40001, "失败", "该账户验证次数已达上限,暂时冻结至" + time + "24点,冻结期结束密码将被重置为初始密码,请联系管理员进行修改");
}else return allResult(params, res);
}
private Result allResult(Map params, UserDO res) {
if(res == null){
System.out.println("--------????----------");
System.out.println("用户名或密码错误");
System.out.println("--------????----------");
loginMapper.setLockNum(params);
return new Result(false, 40001, "失败", "账号或密码错误,请重新输入,超过5次将会被临时冻结");
}else{
System.out.println("-------?????-----------");
System.out.println("用户名或密码");
System.out.println("-------?????-----------");
return new Result(true, 20000, "成功", res);
}
}
}
<select id="login" resultType="com.zdxf.domain.UserDO">
select *
from fenghuang_cmda.sys_user
<where>
username = #{username}
and
password = #{password}
and
lock_status = 0
</where>
</select>
<select id="getLockStatus" resultType="com.zdxf.domain.UserDO">
select *
from fenghuang_cmda.sys_user
<where>
username = #{username}
</where>
</select>
<update id="setLockNum">
update fenghuang_cmda.sys_user
set lock_status = (case when error_num = lock_num + 1 then 1 else 0 end),
error_num =(case when error_num < lock_num then error_num + 1 else 5 end)
<where>
username = #{username}
</where>
</update>
<update id="setLockTime">
update fenghuang_cmda.sys_user
set lock_time = DATE_FORMAT(now(),'%Y-%m-%d 23:59:59')/*date_add(now(), interval + 5 minute)*/
<where>
username = #{username}
</where>
</update>
<update id="resetLockStatus">
update fenghuang_cmda.sys_user
set lock_time = null,error_num=0,lock_status=0,password = 'af14a24b93d61df48ee08514cf92c4c5'
<where>
username = #{username}
</where>
</update>
至上一回分解完淘宝详情页( 点击查看 )后,再写了一篇关于商城基础模板装修首页...
大家都知道网页中必须要有图片,那么具体的该如何在网页设计中加入图片呢?下面...
一、反常的SQL语句 某周四午休时分,我正在工位上小憩,睡梦中仿佛看到了自己拿...
前言 现在不管是桌面客户端还是移动客户端,都会夹杂着一部分H5页面,这种混合式...
CSS 是样式、布局和表示的领域。它充斥着颜色、大小和动画。但是你知道吗,它还...
企业内部H5微应用开发 分为 服务端API和前端API的开发,主要涉及到进入应用免登...
css-vars-ponyfill 通过css变量来实现网页换肤的过程中,会出现兼容性问题。 为...
qq空间有欢迎动画,想要给网页制作一个开场动画效果,该怎么制作呢?下面我们就...
一只小奶狗会有名字、品种以及一堆可爱的特点作为其属性。如果将其建模为一个类...
默认uni-app打包出来的H5在Android上是没法播放.m3u8直播流的,控制台或报错 Unc...