用户登陆案例

  这一篇,我们用之前学习过的知识,做一个用户登陆的案例。

1.  需求分析

  用户界面中进行登录判断。输错三次禁止登陆(半小时),用数据库记录ErrorTimes。

   在客户端要求登陆的时候,我们需要将用户名和密码进行验证,如果输错密码的次数达到3次,就禁止用户在半小时内登陆。于是,我们就需要在数据库中记录下用户被禁止登陆的时间。如果输错密码的次数达到了3次,就判断距离禁止登陆的时间是否超过了半个小时;如果超过了,就允许用户登陆。

2.  设计表

    建立用户表 t_user

  

    ErrorTimes  用户输错密码的次数  int类型; LastLockTime  datetime类型 上一次用户被禁止登陆的时间

    数据库里,建表的时候要设计id这一列,一般来说都是将id设置为主键,这是一个很好的编程习惯。因为根据id来操作数据会更安全。

3.  程序逻辑

     (1)确保用户名和密码不为空

     (2)把用户输入

      (3) 判断用户输出密码的次数是否达到3次。小宇3次,用户可以登陆。如果达到了3次,就判断现在的时间距离上一次被禁的时间有多长,如果达到了30分钟,就需要将用户输错密码的次数清零,让用户可以登陆;如果不超过30分钟,就不允许用户登陆。

4.  程序代码

 1             if (tBoxUserName.Text.Length <= 0)
 2             {
 3                 MessageBox.Show("用户名不能为空");
 4                 return;
 5             }
 6             if (tBoxPassWord.Text.Length <= 0)
 7             {
 8                 MessageBox.Show("密码不能为空");
 9                 return;
10             }
 1             DataSet dataSet = SQLHelper.ExecuteDataSet("select * from t_user where [email protected]",
 2                 new SqlParameter("@userName", tBoxUserName.Text));
 3             DataTable table = dataSet.Tables[0];
 4             //编程的时候,我们要对认为不能发生的情况进行处理
 5             if (table.Rows.Count <= 0)
 6             {
 7                 MessageBox.Show("用户名不存在");
 8                 return;
 9             }
10
11             //防御性编程
12             if (table.Rows.Count > 1)
13             {
14                 MessageBox.Show("用户名重复");
15                 return;
16             }
 1             DataRow row = table.Rows[0];
 2             long id = (long)row["Id"];
 3             string userName = (string)row["UserName"];
 4             string passWord = (string)row["PassWord"];
 5             int errorTimes = (int)row["ErrorTimes"];
 6
 7             if (errorTimes >= 3)
 8             {
 9                 if (row["LastLockTime"] != null)
10                 {
11                     DateTime lastLockTime = Convert.ToDateTime(row["LastLockTime"]);
12                     //计算时间间隔
13                     TimeSpan timeSpan = DateTime.Now - lastLockTime;
14                     if (timeSpan >= TimeSpan.FromMinutes(30)) //将30分钟转换成时间间隔的形式
15                     {   //30分钟后,解除账号登陆的锁定
16                         SQLHelper.ExecuteNoQuery("Update t_user set ErrorTimes = 0 where Id = @id",
17                             new SqlParameter("@id", id));
18                         errorTimes = 0;
19                     }
20                     else
21                     {
22                         MessageBox.Show("你的账号已被锁定!");
23                         return;
24                     }
25                 }
26                 else
27                 {
28                     MessageBox.Show("你的账号已被锁定!");
29                     return;
30                 }
31             }
            if (passWord != tBoxPassWord.Text)
            {
                MessageBox.Show("密码不正确!");
                SQLHelper.ExecuteNoQuery("Update t_user set ErrorTimes = ErrorTimes + 1 where [email protected]",
                    new SqlParameter("@id",id));
                //第3次密码错误的时候,将出错的时间写入数据库
                if (errorTimes >= 2) //之前已经出错2次
                {
                    SQLHelper.ExecuteNoQuery("Update t_user set LastLockTime = @lockTime where [email protected]",
                        new SqlParameter("@lockTime",System.DateTime.Now), new SqlParameter("@id",id));
                }
                return;
            }
            else
            {
                MessageBox.Show("登陆成功!");
                return;
            }

5.  datetime类型

    LastLockTime 这个字段是datetime类型,在程序中进行转换的时候,我们需要将它转换成C#中的DateTime类型,注意DateTime是一个结构体,不能象int类型那样使用(int)来进行强制转换。正确的转换方法:DateTime lastLockTime = Convert.ToDateTime(row["LastLockTime"]);

6.  防御性编程

    或消除墨菲定律效力。毕竟,人总是难免会犯错;任何小概率的事件都有可能会发生;在程序中,BUG经常出现在我们认为不可能发生的事情点上。

    所以在程序中,我们需要先设计号程序的流程,把会发生的可能性考虑进去,设立多重关卡,来杜绝BUG的产生。

    在上面的代码中,如果 table.Rows.Count 等于 0的时候,用户名是不存在的。通常会写成if (table.Rows.Count == 0),因为我们认为table.Rows.Count不可能为0,但在程序运行的时候,难免会有意外的情况出现,有可能因为某个意外,table.Rows.Count的值变成了负数,有可能会造成灾难性的结果。 所以if (table.Rows.Count <= 0)  这样的写法会更为安全。不管是做什么,还是安全第一。

时间: 2024-10-14 07:16:30

用户登陆案例的相关文章

Session小案例------完成用户登陆

Session小案例------完成用户登陆 在项目开发中,用户登陆功能再寻常不过啦,当用户完成用户名和密码校验后,进入主界面,需要在主界面中显示用户的信息,此时用session来记住用户是最为合适不过了. 功能实现如下: 1,完成用户登陆功能 2,在主界面记住用户 3,完成用户注销功能 用户类: package cn.itcast.login; public class User{ private String username; private String password; public

java 17 -1 用户登陆注册案例(集合版)

需求: 用户登录注册案例 按照如下操作,可以让我们更符合面向对象思想: A:这个案例有哪些类 B:每个类中又有哪些东西 C:类与类之间的关系 分析: A:这个案例有哪些类 用户类 测试类 B:每个类中又有哪些东西 用户类: 成员变量:用户名.密码 构造方法:无参构造 成员方法:getXxx().setXxx() 登陆,注册 但,如果用户类的内容过多的时候,维护起来比较麻烦. 所以,为了以后维护起来比较容易,我们需要更清晰的分类: 用户类可以再分为2个类: 用户基本描述类: 成员变量:用户名.密码

android 登陆案例_最终版本 sharedpreference

xml  与之前的登陆案例相同 java代码: 1 package com.itheima.login; 2 3 import java.util.Map; 4 5 import com.itheima.login.util.UserInfoUtil; 6 import com.itheima.login_shared.R; 7 8 import android.app.Activity; 9 import android.content.Context; 10 import android.o

09_android入门_采用android-async-http开源项目的GET方式或POST方式实现登陆案例

根据08_android入门_android-async-http开源项目介绍及使用方法的介绍,我们通过最常见的登陆案例进行介绍android-async-http开源项目中有关类的使用.希望对你学习android-async-http开源项目有所帮助. 1.继续采用03_android入门_采用RelativeLayout实现登陆界面为该案例的布局文件 2.服务器端的代码采用04_android入门_采用HttpURLConnection的GET方式实现登陆案例中的服务器代码片段(5.关于服务

07_android入门_采用HttpClient的POST方式、GET方式分别实现登陆案例

1.简介 HttpClient 是 Apache Jakarta Common 下的子项目,可以用来提供高效的.最新的.功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议. 2.功能介绍 以下列出的是 HttpClient 提供的主要的功能,要知道更多详细的功能可以参见 HttpClient 的主页. (1)实现了所有 HTTP 的方法(GET,POST,PUT,HEAD 等) (2)支持自动转向 (3)支持 HTTPS 协议 (4)支持代理服务器等 3

09_android入门_採用android-async-http开源项目的GET方式或POST方式实现登陆案例

依据08_android入门_android-async-http开源项目介绍及用法的介绍,我们通过最常见的登陆案例进行介绍android-async-http开源项目中有关类的使用.希望对你学习android-async-http开源项目有所帮助. 1.继续採用03_android入门_採用RelativeLayout实现登陆界面为该案例的布局文件 2.server端的代码採用04_android入门_採用HttpURLConnection的GET方式实现登陆案例中的server代码片段(5.

java web笔记——软件三层结构&amp;MVC模式实现注册登陆案例

<学习笔记> Servlet+JSP+JavaBean(MVC)模式适合开发较复杂的web应用,在这种模式下,servlet负责处理用户请求,jsp负责数据显示,javaBean负责封装数据,各个模块之间层次清晰. 软件三层结构为Web层.业务逻辑层(service层).数据访问层(dao层). 简易的注册登陆案例 项目完整源码地址:https://git.oschina.net/beyondzl/register_login 1.搭建开发环境 1.1导人第三方开发包 dom4j-1.6.1.

04_android入门_采用HttpURLConnection的GET方式实现登陆案例

1.概述 每个 HttpURLConnection 实例都可用于生成单个请求,但是其他实例可以透明地共享连接到 HTTP 服务器的基础网络.请求后在 HttpURLConnection 的 InputStream 或 OutputStream 上调用 close() 方法可以释放与此实例关联的网络资源,但对共享的持久连接没有任何影响.如果在调用 disconnect() 时持久连接空闲,则可能关闭基础套接字. 2.在03_android入门_采用RelativeLayout实现登陆界面效果的案例

07_android入门_採用HttpClient的POST方式、GET方式分别实现登陆案例

1.简单介绍 HttpClient 是 Apache Jakarta Common 下的子项目,能够用来提供高效的.最新的.功能丰富的支持 HTTP 协议的客户端编程工具包,而且它支持 HTTP 协议最新的版本号和建议. 2.功能介绍 ? ? 下面列出的是 HttpClient 提供的基本的功能,要知道很多其它具体的功能能够參见 HttpClient 的主页. (1)实现了全部 HTTP 的方法(GET,POST,PUT,HEAD 等) (2)支持自己主动转向 (3)支持 HTTPS 协议 (4