生成验证码,同时异步获取加密后的验证码

本文介绍了一种在不使用状态传递的情况下,通过异步方式实现验证码图片和加密字符串一同返回的技术方案。该方案利用了jQuery进行异步加载,并在服务器端采用C#生成验证码图片及对应的MD5加密字符串。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天忙了一天,主要是考虑如何把验证码图片和加密的字符串一同返回,由于上司要求不能用状态来在页面直接传递值,所以只好用异步的了。

验证码的引用页面

 

<%@ Page Language="C#" AutoEventWireup="true"  CodeFile="Default.aspx.cs" Inherits="_Default" %>

<!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>无标题页</title>
     <script language="javascript" src="js/jquery-1.2.6.js"></script>
    <script language="javascript" type="text/javascript">
function change()
{
    var img = document.getElementById("Image1");
//var txt=img.getElementById("Text1");
    img.src = img.src + '?';
    $("#md5").load("ValiateCode.aspx", {id:"md5"});

}
function firstload() {
    $("#md5").load("ValiateCode.aspx", { id: "md5" });
}
function test() {
    var hid1 = document.getElementById("hid1");
    if (hid1.value == "0") {
        //如果是第一次加载,则操作
        $("#md5").load("ValiateCode.aspx", { id: "md5" });
    }
    else {
        //否则不动作
    }
}
</script>
</head>
<body onload="test()">
    <form id="form1" runat="server">
    <div id="md5"></div>
    <input type="hidden" id="hid1" runat="server" value="0" />

    <div>
       <img alt="" src="ValiateCode.aspx" id="Image1" runat="server"/><a href="javascript:change();">看不清,换一张</a>
    </div>
    </form>
</body>
</html>

生成验证码的页面

 

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="ValiateCode.aspx.cs" Inherits="ValiateCode" %>

<!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>无标题页</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
      
        <div id="result" runat="server"></div>
    </div>
    </form>
</body>
</html>

 

 

public partial class ValiateCode : System.Web.UI.Page
{
    public string VNum;
    protected void Page_Load(object sender, EventArgs e)
    {

        if (!Page.IsPostBack)
        {
        }
    }
    protected override void Render(HtmlTextWriter writer)
    {
        base.Render(writer);
        if (Request.Form["id"] == null)
        {
            //这里用到session只局限于ValiateCode页面内部

           VNum = this.GenerateNumber(5);
            string md5String = Get_MD5_Method(VNum);
            ChangeTextValue(md5String);
            Session["VNum"] = VNum;
            this.Validate_Code(VNum);
        }

        if (Request.Form["id"] != null)
        {
            //Response.ClearContent();//需要输出图象信息 要修改HTTP头
            VNum = Session["VNum"].ToString();
            Response.Write(Get_MD5_Method(VNum));
            //Request.Form.Clear();
            Response.End();
        }

    }
    public string Get_MD5_Method(string strSource)
    {
        System.Security.Cryptography.MD5 md5 = new System.Security.Cryptography.MD5CryptoServiceProvider();
        byte[] bytResult = md5.ComputeHash(System.Text.Encoding.Default.GetBytes(strSource));
        //转换成字符串,并取9到25位15  
        string strResult = BitConverter.ToString(bytResult);
        //转换成字符串,32位17  
        //string strResult = BitConverter.ToString(bytResult); 
        //BitConverter转换出来的字符串会在每个字符中间产生一个分隔符,需要去除掉20  
        //strResult = strResult.Replace("-", "");
        return strResult;
    }
    private void ChangeTextValue(string md5String)
    {
        //HtmlInputControl input = (HtmlInputControl)this.FindControl("Text1");
        // input.Value = md5String;
        result.InnerText = md5String;
    }
    private static char[] constant = { '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', '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' };
    public string GenerateNumber(int length)
    {
        System.Text.StringBuilder sb = new System.Text.StringBuilder();
        Random rd = new Random();
        for (int i = 0; i < length; i++)
        {
            sb.Append(constant[rd.Next(62)]);
        }
        return sb.ToString();
    }

    private void Validate_Code(string Num)
    {
        int Gheight = (int)(Num.Length * 13);
        System.Drawing.Bitmap image = new System.Drawing.Bitmap(Gheight, 25);

        Graphics g = Graphics.FromImage(image);
        Rectangle rc = new Rectangle(0, 0, 65, 25);//定义一个矩形

        g.FillRectangle(new SolidBrush(Color.LightYellow), rc);//填充矩形

        g.DrawString(Num, new System.Drawing.Font("Arial", 12), new System.Drawing.SolidBrush(Color.Red), 3, 3);
        //g.FillRectangle(new SolidBrush(new Point(0, 0), new Point(120, 30), Color.FromArgb(0, 0, 0, 0), Color.FromArgb(255, 255, 255, 255)), 0, 0, 120, 30);
        System.IO.MemoryStream ms = new System.IO.MemoryStream();
        image.Save(ms, System.Drawing.Imaging.ImageFormat.Bmp);

        Response.ClearContent();//需要输出图象信息 要修改HTTP头
        Response.ContentType = "image/bmp";
        Response.BinaryWrite(ms.ToArray());
        g.Dispose();
        image.Dispose();
        Response.End();
    }

}

转载于:https://www.cnblogs.com/baixingfa/archive/2009/02/20/1395007.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值