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.pswp.cn/news/443590.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/443590.shtml
英文地址,請注明出處:http://en.pswp.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 …