1

我的一个表格有一个验证码。

我不得不使用这个验证码,因为我之前已经写了很多代码。

这种方法很简单:

有一个ashx文件。将使用该文件创建图像。同时,该文件将从图像中创建一个具有相同值的会话。

提交后,代码将检查它们是否相同。如果是这样,请继续。如果没有,请返回。

页面刷新后,验证码将更新。

然后我需要根据ajax update panel要求添加。

然后验证码在 chrome 和 safari 中仍然可以正常工作,但是当页面在 IE 和 firefox 中再次加载时它不会刷新。

我为验证码创建了一个简单的页面

aspx


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

<!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">

    <asp:ScriptManager ID="ScriptManager1" runat="server">
    </asp:ScriptManager>

    <asp:UpdatePanel ID="UpdatePanel1" runat="server">
        <ContentTemplate>
            <img height="30" alt="" src="Handler.ashx" width="80"><br>
            <asp:Button ID="btnSubmit" runat="server" Text="Submit" 
                onclick="btnSubmit_Click"/>
        </ContentTemplate>
    </asp:UpdatePanel>
    <div>

    </div>
    </form>
</body>
</html>


aspx.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

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

    }
    protected void btnSubmit_Click(object sender, EventArgs e)
    {

    }
}

handler.ashx 

<%@ WebHandler Language="C#" Class="Handler" %>

using System;
using System.Web;
using System.Web.SessionState;
using System.Drawing;
using System.Drawing.Imaging;
using System.Drawing.Text;

public class Handler : IHttpHandler,System.Web.SessionState.IRequiresSessionState {
    public void ProcessRequest(HttpContext context)
        {
            Bitmap objBMP = new System.Drawing.Bitmap(60, 20);
            Graphics objGraphics = System.Drawing.Graphics.FromImage(objBMP);
            //objGraphics.Clear(Color.Blue);

            objGraphics.TextRenderingHint = TextRenderingHint.AntiAlias;

            //' Configure font to use for text
            Font objFont = new Font("Arial", 8, FontStyle.Bold);
            string randomStr = "";
            int[] myIntArray = new int[5];
            int x;

            //That is to create the random # and add it to our string
            Random autoRand = new Random();

            for (x = 0; x < 5; x++)
            {
                myIntArray[x] = System.Convert.ToInt32(autoRand.Next(0, 9));
                randomStr += (myIntArray[x].ToString());
            }

            randomStr = GetRandomString();

            //This is to add the string to session cookie, to be compared later
            context.Session.Add("randomStr", randomStr);



            //' Write out the text
            objGraphics.DrawString(randomStr, objFont, Brushes.White, 3, 3);

            //' Set the content type and return the image
            context.Response.ContentType = "image/GIF";
            objBMP.Save(context.Response.OutputStream, ImageFormat.Gif);

            objFont.Dispose();
            objGraphics.Dispose();
            objBMP.Dispose();

        }

        public bool IsReusable
        {
            get
            {
                return false;
            }
        }

        private string GetRandomString()
        {
            string[] arrStr = "A,B,C,D,1,2,3,4,5,6,7,8,9,0".Split(",".ToCharArray());
            string strDraw = string.Empty;
            Random r = new Random();
            for (int i = 0; i < 5; i++)
            {
                strDraw += arrStr[r.Next(0, arrStr.Length - 1)];
            }
            return strDraw;
        }


}

任何的想法?


我现在得到了答案。

将图像控制更改为服务器控制。

并在后面的代码中使用当前日期时间更改图像源

<img height="30" alt="" src="/Handler.ashx" width="80" runat="server" id="imgCaptcha">

imgCaptcha.Src = "Handler.ashx?dt=" + DateTime.Now.ToString();

4

1 回答 1

0

将图像控制更改为服务器控制。

并在后面的代码中使用当前日期时间更改图像源

<img height="30" alt="" src="/Handler.ashx" width="80" runat="server" id="imgCaptcha">

imgCaptcha.Src = "Handler.ashx?dt=" + DateTime.Now.ToString();
于 2012-08-15T07:07:25.407 回答