java的用户验证功能

我想实现一个功能,就是当一个用户登陆了以后,就不可以在其它的机器上登陆了,我本来想在数据表里加一个标志列用来记录用户的登陆状态,后来想到当用户关闭浏览器时不是这个标识列没有被改回来吗,这样此用户就下次无法登陆了?希望有更好的办法!还有一个问题,就是怎么限制用户的表单重复刷新操作导致数据重复增加或出错?请大家说得详细一点,最好是有源码的!谢谢大家的关注!本人的QQ:295894563.

ç±»:NameII    权限:public
方法:main    权限:public

参数:name,password,denglu,i;
1.参数介绍:
name,数据类型 String ,用来存储一个从 input 中获取的值,在本程序当中用作用户名的存放;
password,数据类型 String ,用来存储一个从 input 中获取的值,在本程序当中用作密码的存放;
denglu,数据类型 boolean,用来存储默认账户的登录状态,true 表示登录成功,false 表示尚未登录;
i,数据类型 int ,用来存储一个用户尝试登录失败次数的值;

2.方法功能:
在控制台输出“请输入用户名:”要求用户从控制台输入一个 String 类型的数值存放到name当中;
而后在控制台输出“请输入密码:”要求用户从控制台输入一个 String 类型的数值存放在password当中;
验证从控制台通过 input 中获取的用户名和密码是否与默认的用户名和密码一致;
如果一致,则输出“登录成功”,并更改用户登录状态 denglu 的值为 true ;
如果不一致,提醒用户登录失败,将用户尝试登录失败的次数加1,并提醒用户账号剩余的尝试登录次数;
用户尝试登录失败的次数达到3次,并提示用户名账号被冻结。

3.代码如下
public class NameII {
 public static void main (String []arge) {
  boolean denglu = false;//声明一个 boolean æ•°æ®ç±»åž‹çš„变量 denglu å­˜å‚¨ç”¨æˆ·åçš„登录状态,默认值为 false å°šæœªç™»å½•ï¼›
  int i = 0;//声明一个 int æ•°æ®ç±»åž‹çš„变量 i å­˜å‚¨ç”¨æˆ·å°è¯•ç™»å½•å¤±è´¥çš„次数;
  java.util.Scanner input = new java.util.Scanner (System.in);

  do{
   System.out.println("请输入用户名:");
   String name = input.next();//声明一个 String æ•°æ®ç±»åž‹çš„变量 name å­˜å‚¨ input ä¸­èŽ·å–的用户名的值;
   System.out.println("请输入密码:");
   String password = input.next();//声明一个 String æ•°æ®ç±»åž‹çš„变量 password å­˜å‚¨ input ä¸­èŽ·å–的密码的值;

   //验证 name ä¸­çš„值和 password ä¸­çš„值是否和用户名和密码一致;
   if ("zhang".equals(name)&&"123".equals(password)){//如果一致则执行以下代码块;
    System.out.println("登录成功");//提示用户名登录成功;
    denglu = true;//更改用户名登录状态;
   }else{//如果不一致则执行以下代码块;

   //提醒用户登录失败,将用户尝试登录失败的次数加1,并提醒用户账号剩余的尝试登录次数;
    i++;
    System.out.println("登录失败,您还可以在尝试" + (3-i) +"次");

    //用户尝试登录失败的次数达到3次,并提示用户名账号被冻结;
    if(i == 3){
     System.out.println("账号或密码错误三次,账号冻结"); 
    }

   }

  }while(i < 3 && !denglu);//满足    å°è¯•ç™»å½•å¤±è´¥çš„次数小于三次的用户    æˆ–    ç™»å½•æˆåŠŸçš„用户;
 }
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2009-05-12
防止用户重复登陆系统(供参考程序流程思想)2008-01-18 10:57很多系统要求防止用户被重复登陆,我们通常思维是当有用户重复登陆时要禁止他再登陆进去,
提示他该账号已经有人在使用中.
然而这样有个问题很难解决,就是系统很难实时捕捉到该账号是否还在使用中,
如当用户非正常退出或者遇到停电等,系统只好等到Session超时后才能知道该账号已经下线.
在Session超时之前这段时间之内没有人使用账号但也没人再能登陆上去,只能干等着了.

我的解决方法是模仿QQ的被迫下线的功能。只要你QQ号和密码正确,随时都可以登陆上去,但是如果
该QQ号此前有人在使用的话那先前的人就会被挤下去。我们这样来实现系统防止用户重复登陆的话就可以轻松实现。关键就是在Application或数据库中记录下在线用户的SessionID,检测使用者的SessionID是否和Application中记录的该用户ID相对应的SessionID相同,若不相同则提示下线!

用户登陆成功时用户ID和SessionID写入Application中。

public void WriteToApplication( string UserID )
{
DataTable dtUserFlagList = new DataTable();
try
{
dtUserFlagList = (DataTable)Application["UserFlagList"];
}
catch
{
dtUserFlagList = null;
}

if( dtUserFlagList == null )
{
DataColumn dc0 = new DataColumn("UserID",typeof(System.String));
DataColumn dc1 = new DataColumn("SessionID",typeof(System.String));

dtUserFlagList.Columns.Add( dc0 );
dtUserFlagList.Columns.Add( dc1 );
dtUserFlagList.Columns.Add( dc2 );

DataRow drUser = dtUserFlagList.NewRow();
drUser["UserID"] = UserID; //写入用户ID
drUser["SessionID"] = Session.SessionID;//记录下SessionID

dtUserFlagList.Rows.Add( drUser );
}
else
{
int i = 1;
foreach( DataRow drUser in dtUserFlagList )
{
if( drUser["UserID"].ToString() == UserID )
{
drUser["SessionID"] = Session.SessionID;//如果在Application中存在当前用户ID,则把记录的SessionID值改为当前的SessionID
break;
}
i++;
}
if( i > dtUserFlagList.Rows.Count )
{
DataRow drUser = dtUserFlagList.NewRow();
drUser["UserID"] = UserID; //写入用户ID
drUser["SessionID"] = Session.SessionID;//记录下SessionID

dtUserFlagList.Rows.Add( drUser );
}
}

Application.Lock();
Application["UserFlagList"] = dtUserFlagList; //记录到Application中
Application.UnLock();

Session["UserID"] = UserID;//把相关登陆信息写入Session
}

下一步我们只要检测Application中记录的SessionID是否和当前的SessionID相同就可以了
我在这里写了一个页面的基类,每个页面继承这个类。这个类改写OnLoad()事件,加入检测SessionID值
public class PageBase : System.Web.UI.Page
{
public PageBase()
{
//
// TODO: 在此处添加构造函数逻辑
//
}

protected override void OnLoad(EventArgs e)
{
base.OnLoad (e);
if( ! IsPostBack )
{
if( Session["UserID"] == null )
{
Response.Redirect("Login.aspx");//没有登陆
return;
}
DataTable dtUserFlagList = (DataTable)Application["UserFlagList"];
foreach( DataRow drUser in dtUserFlagList )
{
if( drUser["UserID"].ToString() == Session["UserID"].ToString() )
{
if( drUser["SessionID"].ToString() == Session.SessionID )
break;//SessionID值相同,没有其他用户登陆
else
{
Session.Abandon();//SessionID不相同,有人在使用该账号,被迫下线
Response.Redirect("ShowError.aspx?action=该账号已在别处登陆",false);
}
}
}
}
}
}

当用户正常退出系统或非正常退出Session超时,在Application中清除该账号的记录
以下代码写在Global.asax.cs文件Session_End方法中
protected void Session_End(Object sender, EventArgs e)
{
if( Session["UserID"] == null )
return;

DataTable dtUserFlagList = (DataTable)Application["UserFlagList"];
foreach( DataRow drUser in dtUserFlagList )
{
if( drUser["UserID"].ToString() == Session["UserID"].ToString() && drUser["SessionID"].ToString() == Session.SessionID )
{
//当UserID和SessionID都和退出用户的值相等时才清除记录。
drUser.Delete();
break;
}
}
dtUserFlagList.AcceptChanges();

Application.Lock();
Application["UserFlagList"] = dtUserFlagList; //将更改记录到Application中
Application.UnLock();
}

以上方法已经在我的系统中实现,在我的系统可以设定某个账号同时登陆多少人,只是在记录中多了一个字段amount。
这个方法可能不好的地方就是每访问一个页面都要检测是否SessionID值相等,本回答被提问者采纳
第2个回答  2009-05-12
用application把登录名和登录机子的ip用array记录下来,当每次登录的时候在application中查找改ID是否已经登录,(是否有IP),取消登录的时候把这条去掉就ok了。

其实用cookie感觉更好。一般网站都用cookie吧,因为cookie安全性好点。还可以方便地设置有效期。
第3个回答  2009-05-12
数据库加个状态字段,然后用session来判断.
关闭浏览器时也监控就可以了.可用js来实现.
只要session失效就执行数据库操作,相当一个监听器的效果.
第4个回答  2015-07-20
用js来写验证,很简单的,这都是最基本的功能,随便找个js实战的书里面都会有

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网