java登录程序用户密码5分钟内输错3次锁定用户账号一天的实现

最近在公司实习的项目遇到这么一个业务需求:用户登录时如果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()) {
                
  • 11
    点赞
  • 58
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值