本方法因为是根据思路纯手写,代码可以再简化,功能尝试没问题,最主要就是在登陆验证中的逻辑,checkLogin()方法是登录前的验证,而真正的登陆方式采用的是Shiro,若不是采用Shiro登陆,将该逻辑采用到自己登陆的方法中即可实现

一、用户验证必须字段  用户实体类中User.java添加一下字段,可自选持久化工具,本次采用jpa作为持久化工具

除了用户id,账户,密码之外其中还必须有三个字段lastLoginErrorTime最后一次登陆错误时间、loginErrorcount登陆错误计数、isLocked是否锁定(0、未锁定;1、锁定)

@Entity

@Table(name = "user_info")

@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)

public class UserInfo implements Serializable{

private static final long serialVersionUID = 1L;

/**

* 用户模式(0,为管理员;1,为普通用户)

*/

@Column

private Integer userModel=1;//默认为普通用户

//public static enum UserType {

//SUPER, NORMAL

//}

/**

* 主键

*/

@Id

@Column(name = "user_id")

@GeneratedValue(strategy=GenerationType.AUTO)

private Integer userId;

/**

* 登录帐号

*/

@Column//(unique = true)

private String userName;

/**

* 用户密码

*/

@Column

private String password="";

/**

* 角色对应外键

*/

@Column

private Integer roleId;

/**

* 部门对应外键

*/

@Column

private Integer departmentId;

/**

* 添加时间

*/

@Column

private Date addTime;

/**

* 最后一次登录时间

*/

@Column

private Date lastLoginTime;

/**

* 最后一次登陆错误时间

*/

@Column(name = "last_login_error_time",columnDefinition="DATETIME COMMENT '最后一次登陆错误时间'")

private Date lastLoginErrorTime;

/**

* 登陆错误计数

*/

@Column(name = "login_rrror_count",columnDefinition="DATETIME COMMENT '登陆错误计数'")

private Integer loginErrorcount;

/**

* 是否锁定(0、未锁定;1、锁定)

*/

@Column(name = "is_locked",columnDefinition="DATETIME COMMENT '是否锁定'")

private Integer isLocked;

// get/set方法此处省略

}

二、对应数据库

三、登陆方法中进行判断验证out.print()打印的是前台接收的Json字符串

/**

* 检查登录是否正确并判断登录项目

*

* @throws IOException

*/

public void checkLogin() throws IOException {

StatusPrinter.print(lc);

HttpServletResponse response = ServletActionContext.getResponse();

response.setCharacterEncoding(DEFAULT_CHARACTER_UTF8);

PrintWriter out = response.getWriter();

HttpSession session = ServletActionContext.getRequest().getSession();

// 得到系统保存的验证码

String valiCode = (String) session.getAttribute("rand");

if (valiCode == null) {

out.print("{\"result\":\"验证码失效,请刷新页面后重试。\",\"msg\":\"系统错误,刷新后重试。\"}"); // 刷新登录

out.flush();

out.close();

return; // 返回结束;

}

// 如果验证码错误

if (!valiCode.equals(rand)) {

out.print(ActionResult.ErrMsg("验证码错误。")); // 刷新登录

out.flush();

out.close();

return; // 返回结束;

}

UserInfo user = userService.getUserByUserName(username);

Date thisErrorLoginTime = null;// 修改的本次登陆错误时间

Integer islocked = 0;// 获取是否锁定状态

if (user == null) {// 账号密码有问题

out.print(ActionResult.ErrMsg("不存在此用户"));

} else if (user.getStatus()==1) {

out.print(ActionResult.ErrMsg("此用户已被删除"));

} else if (!user.getPassword().equals(MD5.getMD5(password.getBytes()))) {

if (user.getIsLocked() == null) {

user.setIsLocked(0);

} else {

islocked = user.getIsLocked();

}

if (user.getLoginErrorcount() == null) {

user.setLoginErrorcount(0);

}

Date date = new Date();

SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

String datestr = format.format(date);

try {

thisErrorLoginTime = format.parse(datestr);

} catch (ParseException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

if (islocked == 1) {// 账户被锁定 // 被锁定是登陆错误次数一定是5,所以只判断一次

Date lastLoginErrorTime = null; // 最后一次登陆错误时间

Long timeSlot = 0L;

if (user.getLastLoginErrorTime() == null) {

lastLoginErrorTime = thisErrorLoginTime;

} else {

lastLoginErrorTime = user.getLastLoginErrorTime();

timeSlot = thisErrorLoginTime.getTime() - lastLoginErrorTime.getTime();

}

if (timeSlot < 1800000) {// 判断最后锁定时间,30分钟之内继续锁定

out.print(ActionResult.ErrMsg("您的账户已被锁定,请" + (30-Math.ceil((double)timeSlot/60000)) + "分钟之后再次尝试"));

} else {// 判断最后锁定时间,30分钟之后仍是错误,继续锁定30分钟

user.setLastLoginErrorTime(thisErrorLoginTime);

userService.addUser(user);

out.print(ActionResult.ErrMsg("账户或密码错误,您的账户已被锁定,请30分钟之后再次尝试登陆"));

}

} else if (user.getLoginErrorcount() == 4) {// 账户第五次登陆失败 ,此时登陆错误次数增加至5,以后错误仍是5,不再递增

user.setLoginErrorcount(5);

user.setIsLocked(1);

user.setLastLoginErrorTime(thisErrorLoginTime);

userService.addUser(user);//修改用户

out.print(ActionResult.ErrMsg("您的账户已被锁定,请30分钟之后再次尝试登陆"));

} else {// 账户前四次登陆失败

user.setLoginErrorcount(user.getLoginErrorcount() + 1);

user.setLastLoginErrorTime(thisErrorLoginTime);

userService.addUser(user);//修改用户

out.print(ActionResult.ErrMsg("账户或密码错误,您还有" + (5-user.getLoginErrorcount()) +"次登陆机会"));

}

} else {

islocked = user.getIsLocked();

if (islocked == 1) {

Date lastLoginErrorTime = null; // 最后一次登陆错误时间

Long timeSlot = 0L;

if (user.getLastLoginErrorTime() == null) {

lastLoginErrorTime = new Date();

} else {

lastLoginErrorTime = user.getLastLoginErrorTime();

timeSlot = new Date().getTime() - lastLoginErrorTime.getTime();

}

if (timeSlot < 1800000) {// 判断最后锁定时间,30分钟之内继续锁定

out.print(ActionResult.ErrMsg("您的账户已被锁定,请" + (30-Math.ceil((double)timeSlot/60000)) + "分钟之后再次尝试"));

} else {// 判断最后锁定时间,30分钟之后登陆账户

RoleInfo r=roleService.getRoleById(user.getRoleId());

if(r.getStatus()==1){

out.print("{\"result\":\"该用户拥有的角色已被管理员删除,请于管理员联系。\"}");

}else{

session.setAttribute("user", user);// 保存当前用户

Date d=new Date();

session.setAttribute("dateStr", d); // 保存当前用户登录时间用于显示

user.setLoginErrorcount(0);

user.setIsLocked(0);

user.setLastLoginTime(user.getLoginTime());

user.setLastLoginIp(user.getLoginIp());

user.setLoginTime(d);

user.setLoginIp(ServletActionContext.getRequest().getRemoteAddr());

userService.addUser(user);//修改用户表登录时间

// logService.addOperationLog("登录系统");

log.info("登录系统");

out.print(ActionResult.SUCCESS);

}

}

} else {

RoleInfo r=roleService.getRoleById(user.getRoleId());

if(r.getStatus()==1){

out.print("{\"result\":\"该用户拥有的角色已被管理员删除,请于管理员联系。\"}");

}else{

session.setAttribute("user", user);// 保存当前用户

Date d=new Date();

session.setAttribute("dateStr", d); // 保存当前用户登录时间用于显示

user.setLoginErrorcount(0);

user.setIsLocked(0);

user.setLastLoginTime(user.getLoginTime());

user.setLastLoginIp(user.getLoginIp());

user.setLoginTime(d);

user.setLoginIp(ServletActionContext.getRequest().getRemoteAddr());

userService.addUser(user);//修改用户表登录时间

// logService.addOperationLog("登录系统");

log.info("登录系统");

out.print(ActionResult.SUCCESS);

}

}

}

out.flush();

out.close();

}

四、实现的逻辑

java 错误登陆次数_纯java代码实现登陆次数验证,登陆错误5次之后锁定30分钟相关推荐

  1. java 获取apk版本号_纯JAVA环境获取APK信息:包名,版本,版本号,大小,权限...

    [实例简介] 纯JAVA环境获取APK信息:包名,版本,版本号,大小,权限... 代码讲解地址:http://blog.csdn.net/chillax_li/article/details/4185 ...

  2. java数据库访问方式_纯java方式连接数据库简单操作

    package com.beiwo; import java.sql.Connection; import java.sql.DriverManager; import java.sql.Result ...

  3. java获取机器序列号_纯java获取CPU序列号,生成机器码

    用于生成机器码 感觉用mac不靠谱,因为mac能改, (除CPU序列号外,还可以获得主板序列号.) public static void main(String[] args) { // TODO A ...

  4. java项目----教务管理系统_基于Java的教务管理系统

    java项目----教务管理系统_基于Java的教务管理系统 2022-04-22 18:18·java基础 最近为客户开发了一套学校用教务管理系统,主要实现学生.课程.老师.选课等相关的信息化管理功 ...

  5. java编写流星_纯Java代码实现流星划过天空

    废话不多说了,直接给大家贴java代码了. import java.awt.Color; import java.awt.Graphics; import java.awt.image.Buffere ...

  6. java数组个数无限_基于Java代码实现数字在数组中出现次数超过一半

    下文通过几种方法给大家介绍java数组数字出现次数,具体内容如下所示: 方法一: 数组排序,然后中间值肯定是要查找的值. 排序最小的时间复杂度(快速排序)O(NlogN),加上遍历. 方法二: 使用散 ...

  7. java强制编译通过_强制java使用用户输入作为消息进行编译错误

    我不知道在Java中是否可行: 我想从用户(从System.in)获得输入,然后使用该输入引发编译错误. 我的意思是,如果用户输入了文本" HELLO",则程序应引发编译错误:编译 ...

  8. java 鼠标精灵_纯Java实现跨平台鼠标键盘模拟、找图找色,Java版按键精灵

    由原本的Java使用JNI调用dll实现模拟辅助操作,升级到纯Java来实现,最新: https://github.com/xnx3/xnx3 1.[代码][Java]代码 /** * 鼠标.键盘.延 ...

  9. java版安卓按键精灵_纯Java实现跨平台鼠标键盘模拟、找图找色,Java版按键精灵...

    由原本的Java使用JNI调用dll实现模拟辅助操作,升级到纯Java来实现,最新:https://github.com/xnx3/xnx3 仙人辅助_寻仙自动打怪 /** * 鼠标.键盘.延迟等基本 ...

最新文章

  1. 8月6日云栖精选夜读 | 阿里云CPFS在人工智能/深度学习领域的实践
  2. linux页面置换的存储,3.4.4 第二次机会页面置换算法
  3. 苹果自动关机_零下二十度,登山表爆表,苹果冻关机,电霸手机好
  4. IDEA创建springboot项目:Unable to import maven project: See logs for details
  5. postgreSQL的索引
  6. java项目:永和大王项目_Java项目:书评
  7. mysql权限分立_MySQL设置3权分立
  8. 睡眠音频分割及识别问题(四)--YAMNet简介
  9. 如何批量查问PR值、百度权重、百度快照及收录量,用BlueCatTools批量网站查询工具
  10. twitter中处理网页被iframe方式
  11. linux 快速启动程序,centos7快速启动应用程序教程
  12. python实现QQ空间自动点赞功能
  13. 华为交换机配置时区_华为交换机设置时间问题
  14. 阿里云思维导图系列(一)开篇
  15. Markdown文件的标题分级自动编号——Typora
  16. Java编程题之某年某月某日
  17. idea 复制java文件_IDEA复制项目Module出现java文件夹source root解决方法
  18. css圣杯布局与双飞翼布局_CSS布局研讨会已于2018年更新
  19. 从《西部世界》到GAIL(Generative Adversarial Imitation Learning)算法
  20. python输入一个数字n、计算1到n的和_怎么用python求1到n所有整数的和

热门文章

  1. 二. 简单的NSIS安装包
  2. 创业型公司的产品经理应该知道的事情
  3. WinCE Emulator使用介绍
  4. 马逊s3云存储接口_当对象存储“湖”有了强一致性
  5. 影像拼接(3种方法)
  6. 【转】libpcap实现机制及接口函数
  7. 【转】Windows Server 2012 R2 双网卡绑定
  8. 访问网络共享时出现“拒绝访问”
  9. Sharepoint学习笔记—error处理-- The user does not exist or is not unique.
  10. C#通用类Helper整理