17.6用户登录处理模块
17.6 用户登录处理模块
本节开始编写用户登录验证处理代码,这部分代码的功能是提供用户登录表单,并对获取的登录数据进行验证,确保只有合法用户才能登录系统。
17.6.1 创建图文验证码
所谓验证码,是指利用随机产生的字符生成一幅图片,在图片中添加一些干扰像素,让用户肉眼识别其中的验证码信息。在输入表单输入验证码并提交后,经验证成功后才能使用某项功能,例如登录站点。设置验证码的主要目的是防止用户在站点中恶意注册、登录和灌水。
本项目验证码功能的实现过程如下。
1.创建验证码类库
本实例创建验证码类库的操作过程如下。
(1)在Visual Studio 2012中新建一个类库工程,命名为“ValidateCode”,如图17-2所示。
图17-2 新建类库
(2)设置类文件名为“Yanzhengma.cs”,设置程序集名为“ASPNETAJAXWeb.ValidateCode”,设置默认命令空间为“ASPNETAJAXWeb.ValidateCode.Page”,如图17-3所示。
图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" %>
17.6.2 编写用户登录界面
所谓用户登录界面,是指提供用户登录表单供用户登录当前系统。本项目的用户登录界面是由文件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所示。
图17-4 初始显示效果
图17-5 Ajax提示效果
图17-6 验证码提示效果
17.6.3 登录数据处理
本项目的登录数据处理功能是由文件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所示。
图17-7 用户信息错误提示
图17-8 验证码错误提示
图17-9 登录成功提示
上一篇:17.5设置主题皮肤
下一篇:17.7用户注册处理模块