登录驾驶员培训邢台计时系统登录管理系统的时候,密码连续输入3次都错误了,怎么办?

客 服 中 心
客服热线:2984人阅读
java-web(10)
oracle10g(4)
最近在公司实习的项目遇到这么一个业务需求:用户登录时如果5分钟内密码连续3次输入错误就将用户锁定,24小时后自动解锁。
分析一下,这个需求有很多种方法可以实现,比较简单的就是采用数据库来实现,我采用的是比较老实的办法,欢迎大家留言指正。
公司开发采用的是struts1.1+oracle+MVC,由于某些样式不支持的问题,用户登录数据的检验这些操作我都是传输到servlet中进行的。
第一步:建用户登录记录表
直接贴出sql语句:
create table C_LOGIN_RECORD
NUMBER(10) not null, --登录记录ID,不为空
VARCHAR2(40),
VARCHAR2(10),
--锁定标志,'1'代表锁定状态 '0'未锁定状态
failure_num VARCHAR2(10),
--登录失败次数
login_date
--登录时间,默认为当前时间
登录的时候直接往其中插入数据就好,这里c_id字段非空,是自动递增的,由于在oracle中没有自带的acto-increment,所以采用触发器+序列的方式来实现,代码如下:
create sequence LOGIN_AUTOINC_SEQ
minvalue 1
start with 43
increment by 1
create or replace trigger login_autoinc_tg
before insert on C_LOGIN_RECORD
for each row
select login_autoinc_seq.nextval into :new.c_id from
end login_autoinc_
当往其中插入数据的时候,就会触发触发器,获得ID
第二步:完成dao层的方法
UserParaDao.java
* 判断用户名和密码是否匹配
* userPara
* Exception
public boolean checkNameAndPsw(UserPara userPara) throws Exception {
String sql = "SELECT PASSWORD FROM C_USER WHERE NAME=?\n";
ResultSet rs = DaoUtil.executeQuery(DaoTools.getConnName(), sql,
new String[] { userPara.getName() });
if (rs != null) {
while (rs.next()) {
if (userPara.getPassword().equals(rs.getString("PASSWORD"))) {
return true;
return false;
* 判断用户是否存在
* userName
* Exception
public boolean checkUser(String userName) throws Exception {
String sql = "SELECT NAME FROM C_USER WHERE NAME=?\n";
ResultSet rs = DaoUtil.executeQuery(DaoTools.getConnName(), sql,
new String[] { userName });
if (rs != null) {
while (rs.next()) {
return true;
return false;
* 根据用户名判断是否有过登录记录
public boolean checkLoginRecord(String userName) throws Exception {
String sql = "SELECT COUNT(*) num FROM C_LOGIN_RECORD WHERE USERNAME=?\n ";
ResultSet rs = DaoUtil.executeQuery(DaoTools.getConnName(), sql,
new String[] { userName });
if (rs != null) {
while (rs.next()) {
if ("0".equals(rs.getString("num"))) {
return false;
return true;
* 删除用户的登录记录
* userName
* Exception
public void deleteLoginRecord(String userName) throws Exception {
String sql = "DELETE FROM C_LOGIN_RECORD WHERE USERNAME=? \n";
DaoUtil.executeUpdate(DaoTools.getConnName(), sql,
new String[] { userName });
* 获取用户最近的一条登录记录
* userName
* Exception
public ResultSet getLatestLoginRecord(String userName) throws Exception {
String sql = "SELECT USERNAME, LOCK_FLAG, FAILURE_NUM, LOGIN_DATE "
+ " FROM C_LOGIN_RECORD WHERE
LOGIN_DATE=(SELECT MAX(LOGIN_DATE)"
+ "FROM C_LOGIN_RECORD WHERE USERNAME=? GROUP BY USERNAME)";
return DaoUtil.executeQuery(DaoTools.getConnName(), sql,
new String[] { userName });
* 获取用户登录失败次数为2的登录登录时间
* userName
* Exception
public String getFaNum2Record(String userName) throws Exception {
String sql = "SELECT USERNAME,LOGIN_DATE FROM C_LOGIN_RECORD "
WHERE USERNAME=? AND FAILURE_NUM=2";
ResultSet rs = DaoUtil.executeQuery(DaoTools.getConnName(), sql,
new String[] { userName });
if (rs != null) {
while (rs.next()) {
return rs.getString("LOGIN_DATE").replace("T", " ");
return "";
* 插入登录记录
* userName
* lockFlag
* failureNum
public void insertLoginRecord(String userName, String lockFlag,
String failureNum) {
List&String& list=new ArrayList&String&();
String sql="INSERT INTO C_LOGIN_RECORD(USERNAME,LOCK_FLAG,FAILURE_NUM," +
"LOGIN_DATE) values(? ,? ,? , sysdate)";
list.add(userName);
list.add(lockFlag);
list.add(failureNum);
DaoUtil.executeUpdate(DaoTools.getConnName(), sql, list.toArray());
第三步,servlet中进行校验
LoginServlet.java
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String userName = request.getParameter("username");
String passWord = request.getParameter("password");
UserPara userPara = new UserPara(userName, passWord);
UserParaService service = new UserParaService();
if (service.checkUser(userName)) {
if (service.checkLoginRecord(userName)) {
ResultSet rs = service.getLatestLoginRecord(userName);
String lockFlag = "";
String failureNum = "";
String loginDate = "";
if (rs != null && rs.next()) {
lockFlag = rs.getString("LOCK_FLAG");
failureNum = rs.getString("FAILURE_NUM");
loginDate = rs.getString("LOGIN_DATE").replace("T", " ");
if ("1".equals(lockFlag)) {
if (service.localdateLtDate2(loginDate)) {
service.deleteLoginRecord(userName);
if(service.checkNameAndPsw(userPara)){
service.insertLoginRecord(userName, "0", "0");
request.getSession().setAttribute("LoginFlag", "1");
response.sendRedirect("http://localhost:8080/web/prepay/pur/emp/ePricePara.do?action=init");
service.insertLoginRecord(userName, "0", "1");
response.sendRedirect("http://localhost:8080/web/prepay/pur/login/login.jsp?error=2");
response.sendRedirect("http://localhost:8080/web/prepay/pur/login/login.jsp?error=3");
if(service.checkNameAndPsw(userPara)){
service.deleteLoginRecord(userName);
service.insertLoginRecord(userName, "0", "0");
request.getSession().setAttribute("LoginFlag", "1");
response.sendRedirect("http://localhost:8080/web/prepay/pur/emp/ePricePara.do?action=init");
if(service.localdateLtDate(loginDate)){
service.deleteLoginRecord(userName);
service.insertLoginRecord(userName, "0", "1");
response.sendRedirect("http://localhost:8080/web/prepay/pur/login/login.jsp?error=2");
if("2".equals(failureNum)){
String date1=service.getFaNum2Record(userName);
if(service.localdateLtDate(date1)){
service.deleteLoginRecord(userName);
service.insertLoginRecord(userName, "0", "1");
response.sendRedirect("http://localhost:8080/web/prepay/pur/login/login.jsp?error=2");
service.insertLoginRecord(userName, "1", "3");
response.sendRedirect("http://localhost:8080/web/prepay/pur/login/login.jsp?error=4");
service.insertLoginRecord(userName, "0", String.valueOf((Integer.parseInt(failureNum)+1)));
response.sendRedirect("http://localhost:8080/web/prepay/pur/login/login.jsp?error=2");
if(service.checkNameAndPsw(userPara)){
service.insertLoginRecord(userName, "0", "0");
request.getSession().setAttribute("LoginFlag", "1");
response.sendRedirect("http://localhost:8080/web/prepay/pur/emp/ePricePara.do?action=init");
service.insertLoginRecord(userName, "0", "1");
response.sendRedirect("http://localhost:8080/web/prepay/pur/login/login.jsp?error=2");
response.sendRedirect("http://localhost:8080/web/prepay/pur/login/login.jsp?error=1");
} catch (Exception e) {
e.printStackTrace();
service层的部分代码:
UserParaService.java
*判断当前时间与给定时间差是否大于5分钟
* 大于5分钟返回true
* Exception
public boolean localdateLtDate(String date) throws Exception{
SimpleDateFormat sdf=new SimpleDateFormat("yyyyMMdd HH:mm:ss");
Date date1=sdf.parse(date);
Date now=sdf.parse(sdf.format(new Date()));
if(now.getTime()-date1.getTime()&5*60*1000){
return true;
return false;
*判断当前时间与给定时间差是否大于一天
* 大于一天返回true
* Exception
public boolean localdateLtDate2(String date) throws Exception{
SimpleDateFormat sdf=new SimpleDateFormat("yyyyMMdd HH:mm:ss");
Date date1=sdf.parse(date);
Date now=sdf.parse(sdf.format(new Date()));
if(now.getTime()-date1.getTime()&24*60*60*1000){
return true;
return false;
登录jsp的js处理:
document.body.onload=function(){
var errori='&%=request.getParameter("error")%&';
if(errori=='1'){
alert("用户不存在!");
}else if(errori=='2'){
alert('用户名密码不匹配!');
}else if(errori=='3'){
alert("用户处于锁定状态!");}
else if(errori=='4'){
alert('密码连续3次输入错误,用户将被锁定24小时!');
if(document.myform.username.value==''&&document.myform.password.value==''){
document.myform.username.focus();
function EnterPress(e){
var e = e || window.
if(e.keyCode == 13){
checkuser();
function checkuser(){
var forma=document.forms[0];
if(forma.username.value.length&1&&forma.password.value.length&1){
return true;
alert('用户名或密码不能为空');
return false;
基本的逻辑就是这样,流程图当时随手画的,被扔掉了,有不对的地方欢迎大家指正。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:18243次
排名:千里之外
原创:27篇
(1)(4)(2)(2)(5)(7)(8)(2)如果输入用户名和密码连续错误3次,提示”账号冻结” - 开源中国社区
当前访客身份:游客 [
当前位置:
发布于 日 22时,
如果输入用户名和密码连续错误3次,提示”账号冻结”
代码片段(1)
1.&[代码]如果输入用户名和密码连续错误3次,提示”账号冻结”&&&&
public class Test4{
public static void main(String[]args){
java.util.Scanner input=new java.util.Scanner(System.in);
int errorNum=0;
boolean flag=
String Lastname="";
while(true){
System.out.println("请输入账户名称:");
String name=input.next();
System.out.println("请输入密码:");
String password=input.next();
if(name.equals("Tom")&&password.equals("123")){
System.out.println("**欢迎来到Tom世界**");
if(!name.equals(Lastname)){
errorNum=0;
errorNum++;
if(errorNum==3){
System.out.println("密码连续3次错误,该账户已被冻结");
开源中国-程序员在线工具:
连续输入好几次都不能提示密码错误哦
2楼:skytang 发表于
这是我改进的代码.
package org.
import java.util.*;
public class Test5 {
* @param args
public static void main(String[] args) {
Login l = new Login();
l.account();
class Login{
int errorNum =1;
public void account (){
Scanner input = new Scanner(System.in);
System.out.print(&请输入账号:&);
String name = input.next();
System.out.print(&请输入密码:&);
String passwd = input.next();
if (name.equals(&sky&)&&passwd.equals(&sky123&)){
System.out.println(&欢迎登陆XXX管理后台&);
if (errorNum !=3){
errorNum++;
account();
loginFailed();
public void loginFailed(){
System.out.println(&你的账号已被锁,请十分钟后登陆!&);
3楼:二月十六 发表于
这个是假的啊。。
4楼:二月十六 发表于
这个是假的啊。。
5楼:KingSirLee 发表于
引用来自“skytang”的评论连续输入好几次都不能提示密码错误哦我这个是同一用户名密码连续输入三次才提示被冻结
6楼:拉夫斯基 发表于
用户名相同,连输三次错误密码,就是对的
7楼:KingSirLee 发表于
引用来自“WuZhiyi”的评论用户名相同,连输三次错误密码,就是对的嗯 就是这样考虑的 如果用户名不一样都不知道该冻结哪个了
8楼:思维80 发表于
你这个是用java的main方法写的,有没有用js写的呀。
开源从代码分享开始
KingSirLee的其它代码

我要回帖

更多关于 邢台计时系统登录 的文章

 

随机推荐