zoukankan      html  css  js  c++  java
  • 登录锁定个人收藏代码

    场景:用户连续登录错误次数达到5次后,账号被锁定。需要等待5分钟才能登录

    建表sql

    -- Create table
    create table W_LOGIN_RECORD
    (
      id          NUMBER(15) not null,
      username    VARCHAR2(40),
      lock_flag   VARCHAR2(10),
      failure_num VARCHAR2(10),
      login_date  DATE,
      userloginip VARCHAR2(50)
    )
    
    -- Add comments to the columns 
    comment on column W_LOGIN_RECORD.id
      is '主键id';
    comment on column W_LOGIN_RECORD.username
      is '登录用户名';
    comment on column W_LOGIN_RECORD.lock_flag
      is '锁定标志,1代表锁定状态 0未锁定状态';
    comment on column W_LOGIN_RECORD.failure_num
      is '登录错误,次数';
    comment on column W_LOGIN_RECORD.login_date
      is '登录时间,默认为当前时间';
    comment on column W_LOGIN_RECORD.userloginip
      is '用户登录ip';
    建表

    javaBean

    package com.loginRecord.model.loginRecord;
    
    
    /**
     * 对象功能:W_LOGIN_RECORD Model对象
     */
    public class LoginRecord {
        // 主键
        protected Long id;
        /**
         * USERNAME
         */
        protected String username;
        /**
         * 锁定标志,1代表锁定状态 0未锁定状态
         */
        protected String lock_flag;
        /**
         * FAILURE_NUM
         */
        protected String failure_num;
        /**
         * 登录时间,默认为当前时间
         */
        protected java.util.Date login_date;
    
        /**
         * userLoginIp
         */
        protected String userLoginIp;
    
        public String getUserLoginIp() {
            return userLoginIp;
        }
    
        public void setUserLoginIp(String userLoginIp) {
            this.userLoginIp = userLoginIp;
        }
    
        public Long getId() {
            return id;
        }
    
        public void setId(Long id) {
            this.id = id;
        }
    
        public void setUsername(String username) {
            this.username = username;
        }
    
        /**
         * 返回 USERNAME
         * 
         * @return
         */
        public String getUsername() {
            return this.username;
        }
    
        public void setLock_flag(String lock_flag) {
            this.lock_flag = lock_flag;
        }
    
        /**
         * 返回 锁定标志,1代表锁定状态 0未锁定状态
         * 
         * @return
         */
        public String getLock_flag() {
            return this.lock_flag;
        }
    
        public void setFailure_num(String failure_num) {
            this.failure_num = failure_num;
        }
    
        /**
         * 返回 FAILURE_NUM
         * 
         * @return
         */
        public String getFailure_num() {
            return this.failure_num;
        }
    
        public void setLogin_date(java.util.Date login_date) {
            this.login_date = login_date;
        }
    
        /**
         * 返回 登录时间,默认为当前时间
         * 
         * @return
         */
        public java.util.Date getLogin_date() {
            return this.login_date;
        }
    
        @Override
        public int hashCode() {
            final int prime = 31;
            int result = 1;
            result = prime * result + ((failure_num == null) ? 0 : failure_num.hashCode());
            result = prime * result + ((id == null) ? 0 : id.hashCode());
            result = prime * result + ((lock_flag == null) ? 0 : lock_flag.hashCode());
            result = prime * result + ((login_date == null) ? 0 : login_date.hashCode());
            result = prime * result + ((userLoginIp == null) ? 0 : userLoginIp.hashCode());
            result = prime * result + ((username == null) ? 0 : username.hashCode());
            return result;
        }
    
        @Override
        public boolean equals(Object obj) {
            if (this == obj)
                return true;
            if (obj == null)
                return false;
            if (getClass() != obj.getClass())
                return false;
            LoginRecord other = (LoginRecord) obj;
            if (failure_num == null) {
                if (other.failure_num != null)
                    return false;
            } else if (!failure_num.equals(other.failure_num))
                return false;
            if (id == null) {
                if (other.id != null)
                    return false;
            } else if (!id.equals(other.id))
                return false;
            if (lock_flag == null) {
                if (other.lock_flag != null)
                    return false;
            } else if (!lock_flag.equals(other.lock_flag))
                return false;
            if (login_date == null) {
                if (other.login_date != null)
                    return false;
            } else if (!login_date.equals(other.login_date))
                return false;
            if (userLoginIp == null) {
                if (other.userLoginIp != null)
                    return false;
            } else if (!userLoginIp.equals(other.userLoginIp))
                return false;
            if (username == null) {
                if (other.username != null)
                    return false;
            } else if (!username.equals(other.username))
                return false;
            return true;
        }
    
        @Override
        public String toString() {
            return "LoginRecord [id=" + id + ", username=" + username + ", lock_flag=" + lock_flag + ", failure_num=" + failure_num + ", login_date=" + login_date + ", userLoginIp=" + userLoginIp + "]";
        }
    }
    实体类

    dao层

    dao层
    package com.xxx.loginRecord.dao.loginRecord;
    
    import java.util.List;
    
    import org.eclipse.jdt.core.dom.ThisExpression;
    import org.springframework.stereotype.Repository;
    
    import com.hotent.core.db.BaseDao;
    import com.xxx.loginRecord.model.loginRecord.LoginRecord;
    import com.hotent.core.db.BaseDao;
    
    @Repository
    public class LoginRecordDao extends BaseDao<LoginRecord>
    {
        @Override
        public Class<?> getEntityClass()
        {
            return LoginRecord.class;
        }
    
        public List<LoginRecord> getByUserName(String name) {
            return this.getBySqlKey("getByUserName", name);
        }
    
        public void unLock(LoginRecord e) {
             this.update("unLock", e);
        }
    
    }

    controller主要方法

        @RequestMapping({ "list" })
        @Action(description = "查看W_LOGIN_RECORD分页列表")
        public ModelAndView list(HttpServletRequest request, HttpServletResponse response) throws Exception {
            List<LoginRecord> list = this.wLoginRecordService.getAll(new QueryFilter(request, "wLoginRecordItem"));
            String isAdmin = "unOk";
            SysUser su = ContextUtil.getCurrentUser();
            if ((su != null) && (su.getUserId().longValue() == 1L)) {
                isAdmin = "ok";
            }
            ModelAndView mv = getAutoView().addObject("wLoginRecordList", list).addObject("isAdmin", isAdmin);
    
            return mv;
        }
    
        @RequestMapping({ "unLock" })
        @ResponseBody
        public String unLock(HttpServletRequest request, HttpServletResponse response) throws Exception {
            String flag = "unOk";
            String idString = RequestUtil.getString(request, "id");
            LoginRecord e = new LoginRecord();
            if (idString != null) {
                e.setId(Long.valueOf(Long.parseLong(idString)));
                this.wLoginRecordService.unLock(e);
                flag = "ok";
            }
            return flag;
        }
    contorller

     mybaties --> sql

        <update id="unLock" parameterType="com.xxx.loginRecord.model.loginRecord.LoginRecord">
            UPDATE w_login_record SET
            LOCK_FLAG='0',
            FAILURE_NUM='0'
            WHERE
            ID=#{id}
        </update>
    
    
    
    <select id="getByUserName" parameterType="String" resultMap="LoginRecord">
            SELECT <include refid="columns"/>
            FROM w_login_record
            WHERE
            USERNAME=#{name}  
            order by login_date desc
        </select>
    主要sql

     service层主要代码

    public List<LoginRecord> getByUserName(String name){
            return dao.getByUserName(name);
        } 
        public void unLock(LoginRecord e){
             dao.unLock(e);
        } 
        
        
        /**
         *判断当前时间与给定时间差是否大于5分钟 
         * @param date
         * @return 大于5分钟返回true
         * @throws Exception
         */
        public boolean isMaxFiveMin(Date date) {
            Date now=new Date();
            if(now.getTime()-date.getTime()>=5*60*1000){
                return true;
            }
            else{
                return false;
            }
        }
    
        
        /**
         * 
         * @param date1,date2
         * @return 返回时间差,
         * @throws Exception
         */
        public String handleDate(Date date){
            Date now=new Date();
            long x = now.getTime()-date.getTime();
            x=x/1000;
            x=60*5-x;
            DecimalFormat df1 = new DecimalFormat("0");   
            return df1.format(Math.floor(x/60))+"分"+(x%60)+"秒";
        }
    
        /**
         *判断当前时间与给定时间差是否大于一天 
         * @param date
         * @return 大于一天返回true
         * @throws Exception
         */
        public boolean localdateLtDate2(String date) throws Exception{
            SimpleDateFormat sdf=new SimpleDateFormat("yyyyMMdd HH:mm:ss");
            Date date1=sdf.parse(date);
            Date now=new Date();
            if(now.getTime()-date1.getTime()>24*60*60*1000){
                return true;
            }
            else{
                return false;
            }
        }
    service层代码

    关键逻辑判断代码(loginController中)

            // 是否被锁定 实体类
            LoginRecord lr  = this.getLoginRecordByUserName(username);
            boolean locked = this.isLocked(lr);
                
                //如果被锁定
                if (locked) {
                    msg = "账号被锁定请在" + loginRecordService.handleDate(lr.getLogin_date()) + "后登录";
                    Date now = new Date();
                    long x = now.getTime() - lr.getLogin_date().getTime();
                    x = x / 1000;
                    x = 5 * 60 - x;
                    request.getSession().setAttribute(WebAttributes.AUTHENTICATION_EXCEPTION, x);
                    error = true;
                    throw new AccessDeniedException(msg);
                }
    
                int num = Integer.parseInt(lr.getFailure_num());
    
                // 账号未被锁定,继续往下执行
                
                
                //其他登录错误处理(只提醒下面中文部分即可)
                msg ="输入错误!还剩" + (5 - num - 1) + "次输入机会!";
    
                 // 添加错误次数
                lr.setFailure_num((Integer.parseInt(lr.getFailure_num() == null ? "0" : lr.getFailure_num()) + 1) + "");
                //如果超过5次,状态改为1锁定
                if (Integer.parseInt(lr.getFailure_num() == null ? "0" : lr.getFailure_num()) >= 5) {
                    lr.setLock_flag("1");
                }
                loginRecordService.update(lr);
                return ;
                
                
                if (num <= 3 && num >= 0) {
                    // 添加错误次数
                    lr.setFailure_num((Integer.parseInt(lr.getFailure_num() == null ? "0" : lr.getFailure_num()) + 1) + "");
                    msg = "输入错误!还剩" + (5 - num - 1) + "次输入机会";
                    loginRecordService.update(lr);
                    request.getSession().setAttribute(WebAttributes.AUTHENTICATION_EXCEPTION, msg);
                } else if (num == 4) {
                    // 添加错误次数
                    lr.setFailure_num((Integer.parseInt(lr.getFailure_num() == null ? "0" : lr.getFailure_num()) + 1) + "");
                    lr.setLock_flag("1");
                    // 登录时间 设置为第五次,输入错误的时间
                    lr.setLogin_date(new Date());
                    loginRecordService.update(lr);
                    msg = "账号被锁定请在" + loginRecordService.handleDate(lr.getLogin_date()) + "后登录";
                    long x = 0l;
                    x = x / 1000;
                    x = 5 * 60 - x;
                    request.getSession().setAttribute(WebAttributes.AUTHENTICATION_EXCEPTION, x);
                    error = true;
    
                } else {
                    lr.setLock_flag("1");
                    msg = "账号被锁定请在" + loginRecordService.handleDate(lr.getLogin_date()) + "后登录";
                    Date now = new Date();
                    long x = now.getTime() - lr.getLogin_date().getTime();
                    x = x / 1000;
                    x = 5 * 60 - x;
                    request.getSession().setAttribute(WebAttributes.AUTHENTICATION_EXCEPTION, x);
    
                }
    
                loginRecordService.update(lr);
                
                // 成功登陆后,错误次数重置为0
                if (lr != null && !error) {
                    lr.setFailure_num("0");
                    lr.setLogin_date(new Date());
                    loginRecordService.update(lr);
                }
    View Code
  • 相关阅读:
    This theme is released under creative commons licence, all links in the footer should remain intact解决方法 Fred
    增加ubuntu的内存——设置Swap增加内存
    OpenFlow硬件交换机制作及刷机教程
    ubuntu设置中文
    配置树莓派/Linux默认声卡设备
    github基础操作
    Linux手动添加系统环境共享库路径
    Ubuntu登录界面添加root用户登录选项
    python实现树莓派开机自动发送IP到指定邮箱
    语音信号实时采集与处理
  • 原文地址:https://www.cnblogs.com/rdchen/p/15211308.html
Copyright © 2011-2022 走看看