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

本方法因为是根据思路纯手写,代码可以再简化,功能尝试没问题,最主要就是在登陆验证中的逻辑,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方法此处省略

}

二、对应数据库

0a5e09a65250f6d0c904390f3675f9b1.png

三、登陆方法中进行判断验证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();

}

四、实现的逻辑

e602b8ff97dca4a13028340d1e55a0c1.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/443590.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java 监听器 分类_java过滤器和监听器详解 分类: 学习专区

过滤器1、Filter工作原理(执行流程)当客户端发出Web资源的请求时&#xff0c;Web服务器根据应用程序配置文件设置的过滤规则进行检查&#xff0c;若客户请求满足过滤规则&#xff0c;则对客户请求&#xff0f;响应进行拦截&#xff0c;对请求头和请求数据进行检查或改动&#x…

linux java启动脚本文件_不错的linux下通用的java程序启动脚本

#!/bin/sh#该脚本为Linux下启动java程序的通用脚本。即可以作为开机自启动service脚本被调用&#xff0c;#也可以作为启动java程序的独立脚本来使用。##Author: tudaxia.com, Date: 2011/6/7##警告!!!&#xff1a;该脚本stop部分使用系统kill命令来强制终止指定的java程序进程。…

linux心跳包检测代码_OpenSSL心跳包越界读敏感信息泄漏漏洞

发布日期&#xff1a;2014-04-10CVE ID&#xff1a;CVE-2014-0160受影响的软件及系统&#xff1a;OpenSSL 1.0.1&#xff0d;OpenSSL 1.0.1fOpenSSL 1.0.2-betaOpenSSL 1.0.2-beta1未受影响的软件及系统&#xff1a;OpenSSL 0.9.8OpenSSL 1.0.0OpenSSL 1.0.1gOpenSSL 1.0.2-bet…

mysql数据库主要负责存储_mysql数据库自带数据库介绍

show databases&#xff1b;查看mysql自带数据库有information_schema&#xff0c;mysql&#xff0c; performance_schema&#xff0c; testinformation_schema数据库有40张表&#xff0c;如下。在MySQL中&#xff0c;把 information_schema 看作是一个数据库&#xff0c;确切说…

python 编辑数学公式_Jupyter快速编辑高大上数学公式 泰勒展开式

欢迎点击「算法与编程之美」↑关注我们&#xff01;本文首发于微信公众号&#xff1a;"算法与编程之美"&#xff0c;欢迎关注&#xff0c;及时了解更多此系列博客。人工智能的基础是机器学习&#xff0c;而通过之前的几篇博客了解到&#xff0c;机器学习的基础是数学…

用java写一个日历_使用JAVA写一个简单的日历

JAVA写一个简单的日历import java.text.DateFormat;import java.text.ParseException;import java.text.SimpleDateFormat;import java.util.Calendar;import java.util.Date;import java.util.GregorianCalendar;import java.util.Scanner;/*** 制作一个简单的日历** author 这…

MySQL定时任务event,储存过程(定时删除指定时间前90天指定表的数据)

<span style"font-family: Microsoft YaHei; font-size: 14px;">MySQL定时任务event</span> 由于一些业务需求&#xff0c;我们可能需要定时清除数据库一些废弃的数据&#xff0c;可以使用mysql的存储过程和事件来完成。 下面例子定时清除日志表tbl_base…

python慢为什么用的人还很多_为什么是所有人比python标准慢得多吗?

通过使用生成器理解而不是列表理解&#xff0c;可以使这两个函数更快、更具可比性。在s """import numpy as np;x, y np.random.rand(1000),np.random.rand(1000);(all((x[i], y[i])) for i in range(1000)) """timeit.timeit(s,number1000)0.…

Java规定构造方法和类名相同_不是说:java构造方法和类名一定要相同吗?为什么我看见很多构造方法跟类名不完全一致啊?隐藏了什么吗?...

比如以下代码。类名不是TestCar_EX才对吗&#xff1f;为什么构造方法名却是Car&#xff1f;我看见很多教程都是这么写的。晕。。。。。。。。。。。到底怎么样才是对的啊&#xff1f;public class TestCar_EX {public static void main(String[] args) {Car c1 new Car("…

java pdf stamper_PDFStamper在几个PDF文件上失败(itext 5.5.1)

我尝试使用数据填充PDF表单并获得PDFStamper(itext版本5.5.1)以处理多个PDF文件&#xff0c;但在某些情况下它总是失败。示例代码&#xff1a;PdfReader reader new PdfReader(new FileInputStream("C:/Temp/source.pdf"));PdfStamper stamper new PdfStamper(read…

用猎物皮毛换酒喝java_荒野大镖客2三星毛皮狩猎技巧分享 各种类猎物三星皮毛获取方法...

荒野大镖客2三星毛皮怎么获得&#xff1f;想必很多朋友都还不是很清楚吧&#xff0c;所以呢小编今天给大家带来的就是荒野大镖客2三星毛皮狩猎技巧分享&#xff0c;需要的朋友还不快进来看看&#xff1f;三星毛皮狩猎技巧分享猎物体型分水岭建议以狐狸类为例。(1)中型猎物[比狐…

Java调用WebService接口实现发送手机短信验证码功能,java 手机验证码,WebService接口调用...

近来由于项目需要&#xff0c;需要用到手机短信验证码的功能&#xff0c;其中最主要的是用到了第三方提供的短信平台接口WebService客户端接口&#xff0c;下面我把我在项目中用到的记录一下&#xff0c;以便给大家提供个思路&#xff0c;由于本人的文采有限&#xff0c;还请大…

java中的udp丢包_UDP丢包问题

wxbcrefut&#xff1a;谢谢楼主分享&#xff0c;最近也遇到这种问题&#xff0c;我在虚机里测试(配置为8核16G内存)&#xff0c;1s接受2W条数据丢包就特别严重&#xff0c;我还没有处理只是接受而已&#xff0c;不知道问题出在哪&#xff0c;求指教我是用java写的&#xff0c;代…

java人体识别_用华为HMS ML kit人体骨骼识别技术,Android快速实现人体姿势动作抓拍...

items results.getAnalyseList();// 开发者根据需要处理识别结果&#xff0c;例如&#xff0c;在此方法中进行相似度计算&#xff0c;从而在检测到特定姿势后进行拍照等操作。// 需要注意&#xff0c;这里只对检测结果进行处理&#xff0c;不可调用ML Kit提供的其他检测相关接…

java中select的用法_mybaties中select用法,以及常用增删改查

查询语句是使用 MyBatis 时最常用的元素之一select元素配置细节如下属性描述取值默认id在这个模式下唯一的标识符&#xff0c;可被其它语句引用parameterType传给此语句的参数的完整类名或别名resultType语句返回值类型的整类名或别名。注意&#xff0c;如果是集合&#xff0c;…

jpa java.util.map_使用JPA存储Map String,String

JPA 2.0通过ElementCollection注释可以支持原语集合&#xff0c;您可以将其与java.util.Map集合支持一起使用。这样的事情应该起作用&#xff1a;Entitypublic class Example {Id long id;// ....ElementCollectionMapKeyColumn(name"name")Column(name"value&q…

Js获取短信验证码前段效果

一&#xff1a;先上效果图&#xff1a; 二&#xff1a;源代码文件&#xff1a;reg.html: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns"http:…

java简述标识符和保留字区别_Java 基础语法 - 流年似水莫停留的个人页面 - OSCHINA - 中文开源技术交流社区...

Java 基础语法一个Java程序可以认为是一系列对象的集合&#xff0c;而这些对象通过调用彼此的方法来协同工作。下面简要介绍下类、对象、方法和实例变量的概念。对象&#xff1a;对象是类的一个实例&#xff0c;有状态和行为。例如&#xff0c;一条狗是一个对象&#xff0c;它的…

java创建一副牌_用java怎么创建一副扑克牌

一张扑克牌有两个属性&#xff0c;一个是花色(suit)&#xff0c;一个是点数(rank)&#xff0c;下面写一个简单的类Cardpackage com.syz.card;import java.io.Serializable;public class Card implements Serializable{private static final long serialVersionUID -4279016186…

java使用三种循环打印99表_编程题:利用for循环打印 9*9 表

#利用for循环打印 9*9 表?1*111*22 2*241*33 2*36 3*391*44 2*48 3*412 4*4161*55 2*510 3*515 4*520 5*5251*66 2*612 3*618 4*624 5*630 6*6361*77 2*714 3*721 4*728 5*735 6*742 7*7491*88 2*816 3*824 4*832 5*840 6*848 7*856 8*8641*99 2*918 3*927 4*936 5*945 6*954 …