您当前的位置:首页 > 文章教程 > 计算机与互联网 > 网络编程

17.6用户登录处理模块

17.6用户登录处理模块

本节开始编写用户登录验证处理代码,这部分代码的功能是提供用户登录表单,并对获取的登录数据进行验证,确保只有合法用户才能登录系统。

所谓验证码,是指利用随机产生的字符生成一幅图片,在图片中添加一些干扰像素,让用户肉眼识别其中的验证码信息。在输入表单输入验证码并提交后,经验证成功后才能使用某项功能,例如登录站点。设置验证码的主要目的是防止用户在站点中恶意注册、登录和灌水。

本项目验证码功能的实现过程如下。

1.创建验证码类库

本实例创建验证码类库的操作过程如下。

(1)在Visual Studio 2012中新建一个类库工程,命名为“ValidateCode”,如图17-2所示。

图片 365

图17-2 新建类库

(2)设置类文件名为“Yanzhengma.cs”,设置程序集名为“ASPNETAJAXWeb.ValidateCode”,设置默认命令空间为“ASPNETAJAXWeb.ValidateCode.Page”,如图17-3所示。

图片 366

图17-3 设置类库

2.编写处理文件

验证码处理文件Yanzhengma.aspx.cs的功能是设置验证的显示属性、格式和样式,实现指定样式验证码的显示效果。其具体实现过程如下。

(1)声明字段属性

声明类和引用命名空间,使用类ValidateCode声明7个字段,用于获取验证码和设置验证码的长度。对应的实现代码如下。

    private const double IMAGELENGTHBASE = 12.5;
    private const int IMAGEHEIGTH = 22;
    private const int IMAGELINENUMBER = 25;
    private const int IMAGEPOINTNUMBER = 100;
    public static string VALIDATECODEKEY = "VALIDATECODEKEY";
    private int length = 6;
    private string code = string.Empty;
    public int Length
    {
      get
      {
        return length;
      }
      set
      {
        length = value;
      }
    }
    public string Code
    {
      get
      {
        return Code;
      }
    }
    public ValidateCode()
    {
    }
protected override void OnLoad(EventArgs e)
    {
      CreateValidateImage(length);
    }

(2)创建随机字符串

通过方法CreateCode(int length)创建一个由数字组成的、指定长度的随机字符串。对应的实现代码如下。

public string CreateCode(int length)
   {
    if(length <= 0) return string.Empty;
    ///创建一组随机数,并构成验证码
    Random random = new Random();
    StringBuilder sbCode = new StringBuilder();
    for(int i = 0; i < length; i++)
    {
      sbCode.Append(random.Next(0,10));
    }
    ///保存验证码到Session对象中
    code = sbCode.ToString();
    Session[VALIDATECODEKEY] = code;
    return code;
   }

(3)绘制文字图像

通过方法CreateValidateImage(string code)创建验证码的文字图像,通过code参数制定输出的字符串。对应的实现代码如下。

  public void CreateValidateImage(int length)
    { ///创建验证码
      code = CreateCode(length);
      ///创建验证码的图片
      CreateValidateImage(code);
    }
    public void CreateValidateImage(string code)
    {
      if(string.IsNullOrEmpty(code) == true) return;
      ///保存验证码到Session对象中
      Session[VALIDATECODEKEY] = code;
      ///创建一个图像
      Bitmap image = new Bitmap((int)Math.Ceiling((code.Length * IMAGELENGTHBASE)),IMAGEHEIGTH);
      Graphics g = Graphics.FromImage(image);
      ///随机数生成器
      Random random = new Random();
      try
      {
        ///清空图像并指定填充颜色
        g.Clear(Color.White);
        ///绘制图片的干扰线
        int x1,x2,y1,y2;
        for(int i = 0; i < IMAGELINENUMBER; i++)
        {
          x1 = random.Next(image.Width);
          y1 = random.Next(image.Height);
          x2 = random.Next(image.Width);
          y2 = random.Next(image.Height);
          ///绘制干扰线
          g.DrawLine(new Pen(Color.Silver),x1,y1,x2,y2);
        }
        ///绘制验证码
        Font font = new Font("Tahoma",12,FontStyle.Bold | FontStyle.Italic);
        LinearGradientBrush brush = new LinearGradientBrush(new Rectangle(0,0,image.Width,image.Height),
          Color.Blue,Color.DarkRed,1.2f,true);
        g.DrawString(code,font,brush,2.0f,2.0f);
        ///绘制图片的前景噪点
        int x,y;
        for(int i = 0; i < IMAGEPOINTNUMBER; i++)
        {
          x = random.Next(image.Width);
          y = random.Next(image.Height);
          ///绘制点
          image.SetPixel(x,y,Color.FromArgb(random.Next()));
        }
        ///绘制图片的边框线
        g.DrawRectangle(new Pen(Color.Silver),0,0,image.Width - 1,image.Height - 1);
        ///保存图片内容
        MemoryStream ms = new MemoryStream();
        image.Save(ms,ImageFormat.Gif);
        ///输出图片
        Response.ClearContent();
        Response.ContentType = "image/Gif";
        Response.BinaryWrite(ms.ToArray());
      }
      finally
      {  ///释放占有的资源
        g.Dispose();
        image.Dispose();
      }
    }
  }
}

3.设置调用文件

调用文件Yanzhengma.aspx的功能是调用文件Yanzhengma.cs,实现指定效果的验证码显示。文件Yanzhengma.aspx的实现代码如下。

<% @ Page Language="C#|" AutoEventWireup="false" CodeFile="Yanzhengma.cs" Inherits="ASPNETAJAXWeb.ValidateCode.Page.ValidateCode" %>

所谓用户登录界面,是指提供用户登录表单供用户登录当前系统。本项目的用户登录界面是由文件Login.aspx实现的,其主要功能是为用户提供输入用户名和密码表单,同时还将输入的数据提交到数据库,并判断该数据是否合法。

文件Login.aspx的实现过程如下。

(1)插入1个TextBox控件,用于输入用户名称,并设置其值为tbUsername。

(2)插入2个RequiredFieldValidator控件和1个RegularExpressionValidator控件,用于显示用户名的验证处理结果。各控件功能的具体说明如下。

  • 第一个rfNameBlank:验证用户名不能为空。
  • 第二个rfNameValue:验证用户名不能是“请输入用户名称”。
  • 第三个revName:验证用户名的长度。

(3)插入1个TextBoxWatermarkExtender控件,用于显示验证水印结果“请输入用户名称”。

(4)插入3个ValidatorCalloutExtender控件,用于显示验证结果。

文件Login.aspx的主要实现代码如下。

  <asp:ScriptManager ID="sm" runat="server" />
  <table class="Table" border="0" cellpadding="2" bgcolor="Black" cellspacing="1" width="600">
<tr bgcolor="white">
    <td colspan="2"><hr /></td>
   </tr>
   <tr bgcolor="white">
     <td valign="top">用户名称:</td>
     <td width="90%"><asp:TextBox ID="tbUsername" runat="server" SkinID="mm" Width="60%" MaxLength="50"> </asp:TextBox>
       <asp:RequiredFieldValidator ID="rfNameBlank" runat="server" ControlToValidate="tbUsername" Display="none" ErrorMessage="用户名称不能为空!">
</asp:RequiredFieldValidator>
        <asp:RequiredFieldValidator ID="rfNameValue" runat="server" ControlToValidate="tbUsername" Display="none" InitialValue="请输入用户名称" ErrorMessage="用户名称不能为空!">
</asp:RequiredFieldValidator>
        <asp:RegularExpressionValidator ID="revName" runat="server" ControlToValidate="tbUsername" Display="none" ErrorMessage="用户名称的长度最大为50,请重新输入。" ValidationExpression=".{1,50}">
</asp:RegularExpressionValidator>
        <ajaxToolkit:TextBoxWatermarkExtender ID="wmeName" runat="server" TargetControlID="tbUsername" WatermarkText="请输入用户名称" WatermarkCssClass="Watermark">
</ajaxToolkit:TextBoxWatermarkExtender>
        <ajaxToolkit:ValidatorCalloutExtender ID="vceNameBlank" runat="server" TargetControlID="rfNameBlank" HighlightCssClass="Validator">
</ajaxToolkit:ValidatorCalloutExtender>
        <ajaxToolkit:ValidatorCalloutExtender ID="vceNameValue" runat="server" TargetControlID="rfNameValue" HighlightCssClass="Validator">
</ajaxToolkit:ValidatorCalloutExtender>
        <ajaxToolkit:ValidatorCalloutExtender ID="vceNameRegex" runat="server" TargetControlID="revName" HighlightCssClass="Validator">
</ajaxToolkit:ValidatorCalloutExtender>
      </td>
    </tr>
    <tr bgcolor="white">
      <td valign="top">用户密码:</td>
      <td width="90%"><asp:TextBox ID="tbPassword" runat="server" SkinID="mm" Width="60%" MaxLength="50"> </asp:TextBox>
        <asp:RequiredFieldValidator ID="rfPwdBlank" runat="server" ControlToValidate="tbPassword" Display="none" ErrorMessage="用户密码不能为空!"></asp:RequiredFieldValidator>
        <asp:RequiredFieldValidator ID="rfPwdValue" runat="server" ControlToValidate="tbPassword" Display="none" InitialValue="请输入用户密码" Error Message="用户密码不能为空!"></asp:RequiredFieldValidator>
        <ajaxToolkit:TextBoxWatermarkExtender ID="twePwd" runat="server" TargetControlID="tbPassword" WatermarkText="请输入用户密码" WatermarkCssClass= "Watermark"></ajaxToolkit:TextBoxWatermarkExtender>
        <ajaxToolkit:ValidatorCalloutExtender ID="vcePwdBlank" runat="server" TargetControlID="rfPwdBlank" HighlightCssClass="Validator"></ajaxToolkit:ValidatorCalloutExtender>
        <ajaxToolkit:ValidatorCalloutExtender ID="vcePwdValue" runat="server" TargetControlID="rfPwdValue" HighlightCssClass="Validator"></ajaxToolkit:ValidatorCalloutExtender>
      </td>
    </tr>
    <tr bgcolor="white">
      <td>验 证 码:</td>
      <td>
        <asp:TextBox ID="tbCode" runat="server" SkinID="mm" Width="80px"></asp:TextBox>
        <asp:Image ID="imgCode" runat="server" ImageUrl = "Yanzhengma.aspx" />                      
        <asp:Label ID="lbMessage" runat="server" CssClass="Text" ForeColor="Red"></asp:Label></td>
    </tr> 

上述代码执行后,将首先显示默认的登录表单,并在文本框中显示Ajax控件预设的显示文本,如图17-4所示;如果输入的用户名和密码为空,则会显示Ajax控件预设的提示信息,如图17-5所示;如果没有输入验证码,则会显示对应的提示信息,如图17-6所示。

图片 367

图17-4 初始显示效果

图片 368

图17-5 Ajax提示效果

图片 369

图17-6 验证码提示效果

本项目的登录数据处理功能是由文件Login.aspx.cs实现的,其具体实现过程如下。

(1)获取文件Login.aspx的提交事件btnLogin_Click。

(2)根据用户输入的数据获取该记录的ID值。

(3)检测输入的用户名和密码是否都正确。

(4)检测输入的验证码是否正确。

(5)显示对应的处理结果。

文件Login.aspx.cs的主要实现代码如下。

  protected void Page_Load(object sender, EventArgs e)
  {
  }  
  protected void btnLogin_Click(object sender,EventArgs e)
  { 
    if(Session[ValidateCode.VALIDATECODEKEY] == null) return;
    ///验证验证码是否相等
    if(tbCode.Text != Session[ValidateCode.VALIDATECODEKEY].ToString())
    {
      lbMessage.Text = "验证码输入错误,请重新输入。";
      return;
    }
    ///判断用户的名称和密码是否正确
    UserDAL user = new UserDAL();
    SqlDataReader dr = user.GetUserLogin(tbUsername.Text,tbPassword.Text);
    if(dr == null) return;
    if(dr.Read())
    {  ///用户登录成功
      Session["UserInfo"] = dr["ID"].ToString();
      Response.Write("用户登录成功!");
    }
    else
    {  ///用户登录失败
      Response.Write("用户登录失败!");
    }
    dr.Close();
    Response.End();  ///中止网页输出
  }

上述代码的执行结果描述如下:如果输入的用户名和密码错误,则输出对应的提示的信息,如图17-7所示;如果输入的验证码错误,则会显示对应的提示信息,如图17-8所示;如果输入的用户名、密码和验证码数据都正确,则会显示登录成功的提示,如图17-9所示。

图片 370

图17-7 用户信息错误提示

图片 371

图17-8 验证码错误提示

图片 372

图17-9 登录成功提示