最近在公司实习的项目遇到这么一个业务需求:用户登录时如果5分钟内密码连续3次输入错误就将用户锁定,24小时后自动解锁。
分析一下,这个需求有很多种方法可以实现,比较简单的就是采用数据库来实现,我采用的是比较老实的办法,欢迎大家留言指正。
公司开发采用的是struts1.1+oracle+MVC,由于某些样式不支持的问题,用户登录数据的检验这些操作我都是传输到servlet中进行的。
第一步:建用户登录记录表
直接贴出sql语句:
create table C_LOGIN_RECORD
(
c_id NUMBER(10) not null, --登录记录ID,不为空
username VARCHAR2(40), --用户名
lock_flag VARCHAR2(10), --锁定标志,'1'代表锁定状态 '0'未锁定状态
failure_num VARCHAR2(10), --登录失败次数
login_date DATE --登录时间,默认为当前时间
)
登录的时候直接往其中插入数据就好,这里c_id字段非空,是自动递增的,由于在oracle中没有自带的acto-increment,所以采用触发器+序列的方式来实现,代码如下:
-- Create sequence
create sequence LOGIN_AUTOINC_SEQ
minvalue 1
maxvalue 99999999
start with 43
increment by 1
nocache
order;
-- Create trigger
create or replace trigger login_autoinc_tg
before insert on C_LOGIN_RECORD
for each row
begin
select login_autoinc_seq.nextval into :new.c_id from dual;
end login_autoinc_tg;
当往其中插入数据的时候,就会触发触发器,获得ID
第二步:完成dao层的方法
UserParaDao.java
/**
* 判断用户名和密码是否匹配
*
* @param userPara
* @return
* @throws Exception
*/
public boolean checkNameAndPsw(UserPara userPara) throws Exception {
String sql = "SELECT PASSWORD FROM C_USER WHERE NAME=?\n";
ResultSet rs = DaoUtil.executeQuery(DaoTools.getConnName(), sql,
new String[] { userPara.getName() });/*说明一下,这里和后面用到的DaoUtil.executeQuery()方法是公司平台封装的方法,就是一个简单的连接oracle的封装*/
if (rs != null) {
while (rs.next()) {
if (userPara.getPassword().equals(rs.getString("PASSWORD"))) {
return true;
}
}
}
return false;
}
/**
* 判断用户是否存在
*
* @param userName
* @return
* @throws Exception
*/
public boolean checkUser(String userName) throws Exception {
String sql = "SELECT NAME FROM C_USER WHERE NAME=?\n";
ResultSet rs = DaoUtil.executeQuery(DaoTools.getConnName(), sql,
new String[] { userName });
if (rs != null) {
while (rs.next()) {
return true;
}
}
return false;
}
/**
* 根据用户名判断是否有过登录记录
*/
public boolean checkLoginRecord(String userName) throws Exception {
String sql = "SELECT COUNT(*) num FROM C_LOGIN_RECORD WHERE USERNAME=?\n ";
ResultSet rs = DaoUtil.executeQuery(DaoTools.getConnName(), sql,
new String[] { userName });
if (rs != null) {
while (rs.next()) {