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_荒野大镖客2三星毛皮狩猎技巧分享 各种类猎物三星皮毛获取方法...

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

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

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

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

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

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拉丁正方形_LeetCode JAVA解题---824. 山羊拉丁文

LeetCode 题库 全 JAVA 解题824. 山羊拉丁文原题回顾&#xff1a;给定一个由空格分割单词的句子 S。每个单词只包含大写或小写字母。我们要将句子转换为 “Goat Latin”(一种类似于 猪拉丁文 - Pig Latin 的虚构语言)。山羊拉丁文的规则如下&#xff1a;如果单词以元音开头(a, …

opencv 滤镜效果php,OpenCV实现马赛克和毛玻璃滤镜效果

本文为大家分享了OpenCV实现马赛克和毛玻璃滤镜的具体代码&#xff0c;供大家参考&#xff0c;具体内容如下一、马赛克效果马赛克的实现原理是把图像上某个像素点一定范围邻域内的所有点用邻域内随机选取的一个像素点的颜色代替&#xff0c;这样可以模糊细节&#xff0c;但是可…

微信端php 开发技术要求,微信第三方平台开发详解——PHP版

申请第三方平台&#xff0c;这个很简单直接按照提示填写&#xff0c;下面的授权事件接收URL中获取的component_verify_ticket是会过期的&#xff0c;所以不要只获取一次&#xff0c;缓存起来每10分钟会发送一次&#xff0c;每1小时会更新一次。附上我的获取component_verify_ti…

刷题神器怎么导入java,怎么导题库_有没有比较好的可以自己导入题库进行模拟考试练习的软件_淘题吧...

① 本人有一题库&#xff0c;怎么把里面的试题全部导出题库都加密了&#xff0c;没有导出功能。只能固定抽题后&#xff0c;整理出来。② 在线考试系统题库怎么导入数据库优考试的考试系统导入题库是用word和excel的模板去编辑试题&#xff0c;再进行导入③ 如何导出机考app题库…

Java读取指定目录下的所有文件名

1.效果图&#xff1a;在控制台输出所有的文件的文件名如下&#xff1a; 2.FileUtil.java: package cn.gov.csrc.base.report.util;import java.io.File; import java.util.ArrayList;public class FileUtil {/*** 获取指定目录下的所有文件名* * param obj* return*/public sta…

php min命令,php min函数怎么用?

php min函数用于返回一个数组中的最小值&#xff0c;或者几个指定值中的最小值&#xff0c;其语法是min(array_values)&#xff0c;参数array_values必需&#xff0c;指规定一个包含值的数组。php min函数怎么用&#xff1f;定义和用法min() 函数返回一个数组中的最小值&#x…

php协程和goroutine,浅谈协程和Go语言的Goroutine

0x00.前言前面写了一篇今天来学习Go语言的Goroutine机制&#xff0c;这也可能是Go语言最为吸引人的特性了&#xff0c;理解它对于掌握Go语言大有裨益&#xff0c;话不多说开始吧&#xff01;通过本文你将了解到以下内容&#xff1a;什么是协程以及横向对比优势Go语言的Goroutin…

Java实现:月,日,年,周,访问量统计

一&#xff1a;工程截图&#xff1a; 二&#xff1a;运行效果图&#xff1a; 三&#xff1a;CountObjectInfo.java: package cn.csrc.base.count;import java.util.Date;public class CountObjectInfo {// 总访问量合计protected int totalCount 0;// 日访问量protected int d…

JavaMelody开源系统性能监控软件:

一&#xff1a;从网上搜索&#xff0c;发现 javamelody 监控web应用程序不错。 JavaMelody能够在QA和实际运行生产环境监测Java或Java EE应用程序服务器。并以图表的形式显示&#xff1a;Java内存和Java CPU使用情况&#xff0c;用户Session数量&#xff0c;JDBC连接数&#x…

java zoneoffset,java - 如何在java8中获取默认的ZoneOffset? - SO中文参考 - www.soinside.com...

tl;drOffsetDateTime.now().getOffset()但您可能应该使用时区而不是仅仅偏离UTC。ZoneId.systemDefault()Offset versus Time Zoneoffset-from-UTC只是一小时&#xff0c;几分钟和几秒钟 - 仅此而已。time zone是特定地区人民使用的偏移的过去&#xff0c;现在和未来变化的历史…