主要功能:无刷新实现对用户名,密码,中文验证码的验证!
技术要点:使用.NEt2005中新接口“ICallbackEventHandler”用asp.net动态生成中文验证码
话不多说,直接看代码,
只要有两个页面 Login.aspx 和 ImageR.aspx
Login.aspx 的代码如下:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Login.aspx.cs" Inherits="Login" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>Login</title>
<script language="javascript" type="text/javascript">
var div;
function callback()
{
var name=document.getElementById("UserName").value;
var pass=document.getElementById("PassWord").value;
var checkcode=document.getElementById("CheckCode").value;
div=document.getElementById("show_msg");
div.innerHTML = "<img src=img/loading.gif>"+ '正在加载,请稍后.....';
div.style.backgroundColor="AliceBlue";
dos(name+"&"+pass+"&"+checkcode);
}
function ReceiveServerData(text)
{
alert(text);
div.style.display="none";
location.href = location.href;
}
function over(o)
{
o.style.borderColor="#9ECC00";
}
function out(o)
{
o.style.borderColor="#A9BAC9";
}
</script>
</head>
<body>
<form id="form1" runat="server">
<div>
<table style="width: 218px; height: 96px;">
<tr>
<td style="width: 35px">
<asp:Label ID="Label1" runat="server" Text="UserName" ></asp:Label></td>
<td style="width: 205px">
<input id="UserName" type="text" style="border-style:groove; border-color:#A9BAC9; width:148px" onmouseout="out(this)" onmouseover="over(this)" /></td>
</tr>
<tr>
<td style="width: 35px; height: 12px;">
<asp:Label ID="Label2" runat="server" Text="PassWord" Width="44px"></asp:Label></td>
<td style="width: 205px; height: 12px;">
<input id="PassWord" type="password" style="border-style:groove; border-color:#A9BAC9; width:148px" onmouseout="out(this)" onmouseover="over(this)" /></td>
</tr>
<tr>
<td>
<asp:Image ID="Image1" runat="server" ImageUrl="ImageR.aspx" /></td>
<td style="height: 13px; width: 205px;">
<input id="CheckCode" style="border-style:groove; border-color:#A9BAC9; width:55px" onmouseout="out(this)" onmouseover="over(this)" type="text" maxlength="4" /></td>
</tr>
<tr>
<td style="height: 26px">
</td>
<td style="width: 205px; height: 26px">
<input id="Login" type="button" value="登 陆" onclick="callback()" style="width: 60px" />
</td>
</tr>
<tr>
<td style="width: 35px;">
</td>
<td style="width: 205px;">
<div id="show_msg"></div>
</td>
</tr>
</table>
</div>
</form>
</body>
</html>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>Login</title>
<script language="javascript" type="text/javascript">
var div;
function callback()
{
var name=document.getElementById("UserName").value;
var pass=document.getElementById("PassWord").value;
var checkcode=document.getElementById("CheckCode").value;
div=document.getElementById("show_msg");
div.innerHTML = "<img src=img/loading.gif>"+ '正在加载,请稍后.....';
div.style.backgroundColor="AliceBlue";
dos(name+"&"+pass+"&"+checkcode);
}
function ReceiveServerData(text)
{
alert(text);
div.style.display="none";
location.href = location.href;
}
function over(o)
{
o.style.borderColor="#9ECC00";
}
function out(o)
{
o.style.borderColor="#A9BAC9";
}
</script>
</head>
<body>
<form id="form1" runat="server">
<div>
<table style="width: 218px; height: 96px;">
<tr>
<td style="width: 35px">
<asp:Label ID="Label1" runat="server" Text="UserName" ></asp:Label></td>
<td style="width: 205px">
<input id="UserName" type="text" style="border-style:groove; border-color:#A9BAC9; width:148px" onmouseout="out(this)" onmouseover="over(this)" /></td>
</tr>
<tr>
<td style="width: 35px; height: 12px;">
<asp:Label ID="Label2" runat="server" Text="PassWord" Width="44px"></asp:Label></td>
<td style="width: 205px; height: 12px;">
<input id="PassWord" type="password" style="border-style:groove; border-color:#A9BAC9; width:148px" onmouseout="out(this)" onmouseover="over(this)" /></td>
</tr>
<tr>
<td>
<asp:Image ID="Image1" runat="server" ImageUrl="ImageR.aspx" /></td>
<td style="height: 13px; width: 205px;">
<input id="CheckCode" style="border-style:groove; border-color:#A9BAC9; width:55px" onmouseout="out(this)" onmouseover="over(this)" type="text" maxlength="4" /></td>
</tr>
<tr>
<td style="height: 26px">
</td>
<td style="width: 205px; height: 26px">
<input id="Login" type="button" value="登 陆" onclick="callback()" style="width: 60px" />
</td>
</tr>
<tr>
<td style="width: 35px;">
</td>
<td style="width: 205px;">
<div id="show_msg"></div>
</td>
</tr>
</table>
</div>
</form>
</body>
</html>
Login.aspx.cs 的代码如下:这个页面实现自 ICallbackEventHandler 接口
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
public partial class Login : System.Web.UI.Page, ICallbackEventHandler
{
private string result;
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
string cbReference = Page.ClientScript.GetCallbackEventReference(this, "text", "ReceiveServerData", ""); //获取一个对客户端函数的引用;调用该函数时,将启动一个对服务器端事件的客户端回调。
string callbackScript = "function dos(text){" + cbReference + ";}"; //注册客户端方法
Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "dos", callbackScript, true); //向客户端写入脚本块
}
}
/// <summary>
/// 处理回调事件。
/// </summary>
/// <param name="text"></param>
public void RaiseCallbackEvent(string text)
{
string checkcode=(string)Session["Code"];
string[] j = text.Split(new char[] { '&' }, 3);
if (j[2] != checkcode)
result = "验证码错误!请重新输入";
else if (j[0] == "1111" && j[1] == "2222")
result = "登陆成功!";
else
result = "登陆失败!";
}
/// <summary>
/// 返回回调事件的结果。
/// </summary>
/// <returns></returns>
public string GetCallbackResult()
{
return result;
}
}
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
public partial class Login : System.Web.UI.Page, ICallbackEventHandler
{
private string result;
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
string cbReference = Page.ClientScript.GetCallbackEventReference(this, "text", "ReceiveServerData", ""); //获取一个对客户端函数的引用;调用该函数时,将启动一个对服务器端事件的客户端回调。
string callbackScript = "function dos(text){" + cbReference + ";}"; //注册客户端方法
Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "dos", callbackScript, true); //向客户端写入脚本块
}
}
/// <summary>
/// 处理回调事件。
/// </summary>
/// <param name="text"></param>
public void RaiseCallbackEvent(string text)
{
string checkcode=(string)Session["Code"];
string[] j = text.Split(new char[] { '&' }, 3);
if (j[2] != checkcode)
result = "验证码错误!请重新输入";
else if (j[0] == "1111" && j[1] == "2222")
result = "登陆成功!";
else
result = "登陆失败!";
}
/// <summary>
/// 返回回调事件的结果。
/// </summary>
/// <returns></returns>
public string GetCallbackResult()
{
return result;
}
}
ImageR.aspx 页面无内容,主要在ImageR.aspx.cs里 代码如下:
using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.Drawing.Drawing2D;
public partial class ImageR: System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
CreateCheckCodeImage(GenCode(4));
}
/// <summary>
/// '产生随机字符串
/// </summary>
/// <param name="num">随机出几个字符</param>
/// <returns>随机出的字符串</returns>
private string GenCode(int num)
{
string str = "的 一是在不了有和人这中大为上个国我以要他时来用们生到作地于出就分对成会可主发年动同工也能下过子说产种面而方后多定行学法所民得经十三之进着等部度家电 力里如水化高自二理起小物现实加量都两体制机当使点从业本去把性好应开它合还因由其些然前外天政四日那社义事平形相全表间样与关各重新线内数正心反你明看 原又么利比或但质气第向道命此变条只没结解问意建月公无系军很情者最立代想已通并提直题党程展五果料象员革位入常文总次品式活设及管特件长求老头基资边流 路级少图山统接知较将组见计别她手角期根论运农指几九区强放决西被干做必战先回则任取据处队南给色光门即保治北造百规热领七海口东导器压志世金增争济阶油 思术极交受联什认六共权收证改清己美再采转更单风切打白教速花带安场身车例真务具万每目至达走积示议声报斗完类八离华名确才科张信马节话米整空元况今集温 传土许步群广石记需段研界拉林律叫且究观越织装影算低持音众书布复容儿须际商非验连断深难近矿千周委素技备半办青省列习响约支般史感劳便团往酸历市克何除 消构府称太准精值号率族维划选标写存候毛亲快效斯院查江型眼王按格养易置派层片始却专状育厂京识适属圆包火住调满县局照参红细引听该铁价严";
char[] chastr = str.ToCharArray();
// string[] source ={ "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "#", "$", "%", "&", "@" };
string code = "";
Random rd = new Random();
int i;
for (i = 0; i < num; i++)
{
//code += source[rd.Next(0, source.Length)];
code += str.Substring(rd.Next(0, str.Length), 1);
}
return code;
}
/// <summary>
/// 生成图片(增加背景噪音线、前景噪音点)
/// </summary>
/// <param name="checkCode">随机出字符串</param>
private void CreateCheckCodeImage(string checkCode)
{
if (checkCode.Trim() == "" || checkCode == null)
return;
Session["Code"] = checkCode; //将字符串保存到Session中,以便需要时进行验证
System.Drawing.Bitmap image = new System.Drawing.Bitmap((int)(checkCode.Length * 21.5), 22);
Graphics g = Graphics.FromImage(image);
try
{
//生成随机生成器
Random random = new Random();
//清空图片背景色
g.Clear(Color.White);
// 画图片的背景噪音线
int i;
for (i = 0; i < 25; i++)
{
int x1 = random.Next(image.Width);
int x2 = random.Next(image.Width);
int y1 = random.Next(image.Height);
int y2 = random.Next(image.Height);
g.DrawLine(new Pen(Color.Silver), x1, y1, x2, y2);
}
Font font = new System.Drawing.Font("Arial", 12, (System.Drawing.FontStyle.Bold));
System.Drawing.Drawing2D.LinearGradientBrush brush = new System.Drawing.Drawing2D.LinearGradientBrush(new Rectangle(0, 0, image.Width, image.Height), Color.Blue, Color.DarkRed, 1.2F, true);
g.DrawString(checkCode, font, brush, 2, 2);
//画图片的前景噪音点
g.DrawRectangle(new Pen(Color.Silver), 0, 0, image.Width - 1, image.Height - 1);
System.IO.MemoryStream ms = new System.IO.MemoryStream();
image.Save(ms, System.Drawing.Imaging.ImageFormat.Gif);
Response.ClearContent();
Response.ContentType = "image/Gif";
Response.BinaryWrite(ms.ToArray());
}
catch
{
g.Dispose();
image.Dispose();
}
}
}
using System.Drawing;
using System.Drawing.Imaging;
using System.Drawing.Drawing2D;
public partial class ImageR: System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
CreateCheckCodeImage(GenCode(4));
}
/// <summary>
/// '产生随机字符串
/// </summary>
/// <param name="num">随机出几个字符</param>
/// <returns>随机出的字符串</returns>
private string GenCode(int num)
{
string str = "的 一是在不了有和人这中大为上个国我以要他时来用们生到作地于出就分对成会可主发年动同工也能下过子说产种面而方后多定行学法所民得经十三之进着等部度家电 力里如水化高自二理起小物现实加量都两体制机当使点从业本去把性好应开它合还因由其些然前外天政四日那社义事平形相全表间样与关各重新线内数正心反你明看 原又么利比或但质气第向道命此变条只没结解问意建月公无系军很情者最立代想已通并提直题党程展五果料象员革位入常文总次品式活设及管特件长求老头基资边流 路级少图山统接知较将组见计别她手角期根论运农指几九区强放决西被干做必战先回则任取据处队南给色光门即保治北造百规热领七海口东导器压志世金增争济阶油 思术极交受联什认六共权收证改清己美再采转更单风切打白教速花带安场身车例真务具万每目至达走积示议声报斗完类八离华名确才科张信马节话米整空元况今集温 传土许步群广石记需段研界拉林律叫且究观越织装影算低持音众书布复容儿须际商非验连断深难近矿千周委素技备半办青省列习响约支般史感劳便团往酸历市克何除 消构府称太准精值号率族维划选标写存候毛亲快效斯院查江型眼王按格养易置派层片始却专状育厂京识适属圆包火住调满县局照参红细引听该铁价严";
char[] chastr = str.ToCharArray();
// string[] source ={ "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "#", "$", "%", "&", "@" };
string code = "";
Random rd = new Random();
int i;
for (i = 0; i < num; i++)
{
//code += source[rd.Next(0, source.Length)];
code += str.Substring(rd.Next(0, str.Length), 1);
}
return code;
}
/// <summary>
/// 生成图片(增加背景噪音线、前景噪音点)
/// </summary>
/// <param name="checkCode">随机出字符串</param>
private void CreateCheckCodeImage(string checkCode)
{
if (checkCode.Trim() == "" || checkCode == null)
return;
Session["Code"] = checkCode; //将字符串保存到Session中,以便需要时进行验证
System.Drawing.Bitmap image = new System.Drawing.Bitmap((int)(checkCode.Length * 21.5), 22);
Graphics g = Graphics.FromImage(image);
try
{
//生成随机生成器
Random random = new Random();
//清空图片背景色
g.Clear(Color.White);
// 画图片的背景噪音线
int i;
for (i = 0; i < 25; i++)
{
int x1 = random.Next(image.Width);
int x2 = random.Next(image.Width);
int y1 = random.Next(image.Height);
int y2 = random.Next(image.Height);
g.DrawLine(new Pen(Color.Silver), x1, y1, x2, y2);
}
Font font = new System.Drawing.Font("Arial", 12, (System.Drawing.FontStyle.Bold));
System.Drawing.Drawing2D.LinearGradientBrush brush = new System.Drawing.Drawing2D.LinearGradientBrush(new Rectangle(0, 0, image.Width, image.Height), Color.Blue, Color.DarkRed, 1.2F, true);
g.DrawString(checkCode, font, brush, 2, 2);
//画图片的前景噪音点
g.DrawRectangle(new Pen(Color.Silver), 0, 0, image.Width - 1, image.Height - 1);
System.IO.MemoryStream ms = new System.IO.MemoryStream();
image.Save(ms, System.Drawing.Imaging.ImageFormat.Gif);
Response.ClearContent();
Response.ContentType = "image/Gif";
Response.BinaryWrite(ms.ToArray());
}
catch
{
g.Dispose();
image.Dispose();
}
}
}