有验证码的登陆界面(ajax,ashx技术制作)
前提:要引用AjaxPro.2.dll(右键--添加引用---选AjaxPro.2.dll文件即可)
备注:程序中的红色部分是经常会搞错的地方,请大家重点关注下。
1、首先制作ashx文件,功能(产生验证码图片,并把验证码保存在Session中,便于以后比对。
[ VDC.ashx ]文件
using System;
using System.Web;
using System.Drawing;
namespace TestExtjsJson.ashx
{
/// <summary>
/// VDC 的摘要说明
/// </summary>
public class VDC : IHttpHandler, System.Web.SessionState.IRequiresSessionState
{
//产生验证码的字符集(去除I 1 l L,O 0等易混字符)
public string charSet = "2,3,4,5,6,8,9,A,B,C,D,E,F,G,H,J,K,M,N,P,R,S,U,W,X,Y";
public void ProcessRequest(HttpContext context)
{
string validateCode = CreateRandomCode(4);
//context.Response.Cookies.Add(new HttpCookie("CheckCode", checkCode));//保存到Cookies 里,但前提对方浏览器允许Cookies操作!
context.Session["CheckCode"] = validateCode; //保存到Session中
CreateImage(validateCode, context);
}
public bool IsReusable
{
get
{
return false;
}
}
/// <summary>
/// 生成验证码
/// </summary>
/// <param name="n">位数</param>
/// <returns>验证码字符串</returns>
private string CreateRandomCode(int n)
{
string[] CharArray = charSet.Split(',');
string randomCode = "";
int temp = -1;
Random rand = new Random();
for (int i = 0; i < n; i++)
{
if (temp != -1)
{
rand = new Random(i * temp * ((int)DateTime.Now.Ticks));
}
int t = rand.Next(CharArray.Length - 1);
if (temp == t)
{
return CreateRandomCode(n);
}
temp = t;
randomCode += CharArray[t];
}
return randomCode;
}
private void CreateImage(string checkCode, HttpContext context)
{
int iwidth = (int)(checkCode.Length * 13);
System.Drawing.Bitmap image = new System.Drawing.Bitmap(iwidth, 23);
Graphics g = Graphics.FromImage(image);
Font f = new System.Drawing.Font("Arial", 12, (System.Drawing.FontStyle.Italic | System.Drawing.FontStyle.Bold));
// 前景色
Brush b = new System.Drawing.SolidBrush(Color.Black);
// 背景色
g.Clear(Color.White);
// 填充文字
g.DrawString(checkCode, f, b, 0, 1);
// 随机线条
Pen linePen = new Pen(Color.Gray, 0);
Random rand = new Random();
for (int i = 0; i < 5; i++)
{
int x1 = rand.Next(image.Width);
int y1 = rand.Next(image.Height);
int x2 = rand.Next(image.Width);
int y2 = rand.Next(image.Height);
g.DrawLine(linePen, x1, y1, x2, y2);
}
// 随机点
for (int i = 0; i < 30; i++)
{
int x = rand.Next(image.Width);
int y = rand.Next(image.Height);
image.SetPixel(x, y, Color.Gray);
}
// 边框
g.DrawRectangle(new Pen(Color.Gray), 0, 0, image.Width - 1, image.Height - 1);
// 输出图片
System.IO.MemoryStream ms = new System.IO.MemoryStream();
image.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
context.Response.ClearContent();
context.Response.ContentType = "image/Jpeg";
context.Response.BinaryWrite(ms.ToArray());
g.Dispose();
image.Dispose();
}
}
}
2、编写登陆界面:testlogin.aspx
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="TestLogin.aspx.cs" Inherits="TestExtjsJson.TestLogin" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="https://www.w3.org/1999/xhtml">
<head id="Head1" runat="server">
<title>威威ERP管理系统--登 陆</title>
<link rel="stylesheet" type="text/css" href="CSS/css.css" />
<script type="text/javascript">
function check() {
var userName = document.getElementById("TxtName").value;
var userPwd = document.getElementById("TxtPwd").value;
if (TestExtjsJson.TestLogin.isRight(userName , userPwd ).value > 0) { //引用函数时一定要写全名称(命名空间.类名.函数)
alert("登陆成功!!");
// TestLogin.WriteSession(userName + "");
//window.location.href = 'Index.aspx';
}
else {
alert("用户名或密码不正确!");
}
}
function checkcode() {
var TxtCode = document.getElementById("TxtCode").value;
var _str = TestExtjsJson.TestLogin.CheckCode(TxtCode).value;
if (_str == "YES") {
alert("验证码正确!!");
check();
}
else {
alert("出错!验证码错误!");
}
}
</script>
</head>
<body style=" text-align:center">
<form id="Form1" runat="server">
<p style="text-align: center; border-width:10px; border-color:blue; width:491px; height:318px; position: relative; top: 120px; left: 31px;">
<img alt="" src="Images/Logintop.jpg" style="height: 169px; width: 492px" />
<p style="left: 119px; width: 272px; position: relative; top: 10px; height: 0px">
<p style="width: 322px; height: 25px; text-align: left">
<span style="font-size: 10pt"> <span>帐 号:<asp:TextBox ID="TxtName" type="text"
runat="server"></asp:TextBox>
</span></span></p>
<p style="width: 322px; height: 25px; text-align: left">
<span style="font-size: 10pt"><span>密 码:<asp:TextBox ID="TxtPwd"
runat="server"></asp:TextBox>
</span></span></p>
<p style="width: 322px; height: 25px; text-align: left">
<span style="font-size: 11pt"> <span style="font-size: 10pt">验证码:</span></span><asp:TextBox ID="TxtCode" runat="server" Width="74px"></asp:TextBox>
<asp:Image ID="Image1" runat="server"
Height="20px" ImageUrl="ashx/VDC.ashx"
Style="left: 0px; position: relative; top: 3px; width: 64px;" />
<input id="Eyes" style="width: 44px; height: 21px" type="button" onclick="javascript:window.location.reload();" value="看不清" class="btn" /></p>
<p style="width: 320px; height: 35px">
</p>
<p style="width: 320px; height: 33px; text-align: left;">
<input id="Login" type="button" value="登 陆" onclick="checkcode();" style="width: 75px" class="btn"/>
<input id="Reset" style="width: 75px" type="reset" value="重 置" class="btn" /></p>
</p>
</p>
</form>
</body>
</html>
3、编写登陆界面的代码部分:testlogin.aspx.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace TestExtjsJson
{
public partial class TestLogin : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
//注册ajax
if (!Page.IsPostBack)
{
AjaxPro.Utility.RegisterTypeForAjax(typeof(TestExtjsJson.TestLogin)); //注册时一定要写 命名空间.类名
}
}
//判断用户名密码是否正确
[AjaxPro.AjaxMethod] //该方式不能读写Session
public int isRight(string userName, string userPwd)
{
int count = 0;
if (userName == "system" && userPwd == "8246")
{
count = 1;
}
else {
count = 0;
}
return count;
/*
//对于 Applciation,和request的操作 不能直接读取,得前缀HttpContext.Current
string str1=Application["App"]; //error
string str2=Request["Req"]; //error
string str3=HttpContext.Current.Application["App"]; //right
string str3=HttpContext.Current.Request["Req"]; //right
*/
}
//判断验证码是否正确
[AjaxPro.AjaxMethod(AjaxPro.HttpSessionStateRequirement.ReadWrite)] // 可以读写Session:
public string CheckCode(string checkcode)
{
string _checkcode = "NO";
if (Session["CheckCode"].ToString().ToUpper() == checkcode)
{
_checkcode = "YES";
}
else {
_checkcode = "NO";
}
return _checkcode;
}
}
}