首页 新闻 会员 周边 捐助

为什么我显示出来的验证码和存到session里的不同步啊?网上查了很久也没解决,求高手解惑。。

0
悬赏园豆:15 [已解决问题] 解决于 2013-11-17 11:59
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Configuration;
using System.Data;
using System.Web.Security;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml;
using System.Drawing;

public partial class ValidNums : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            string validateNum = CreateRanjdomNum(4);          //成生4位随机字符串
            CreateIamge(validateNum);                         //将生成的随机字符串绘成图片
            Session["ValidNums"] = validateNum;                         //保存验证码
        }
    }

    //生成随机字符串
    private string CreateRanjdomNum(int NumCount)
    {
        string allchar = "2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F, G, H,  J, K, L, M, N,  P, Q, R, S, T, U, W, X, Y, Z";
        string[] allcharArray = allchar.Split(',');//拆分成数组
        string randomNum = "";
        int temp = -1;                          //记录上次随机数的数值,尽量避免产生几个相同的随机数
        Random rand = new Random();//声明一个Random对象
        for (int i = 0; i < NumCount; i++)
        {
            if (temp != -1)
            {
                rand = new Random(i * temp * ((int)DateTime.Now.Ticks));

            }
            int t = rand.Next(31);
            if (temp == t)
            {
                return CreateRanjdomNum(NumCount);
            }
            temp = t;
            randomNum += allcharArray[t];                       //生成随机字符串
        }
        return randomNum;
    }

    //生成图片
    private void CreateIamge(string validateNum)
    {
        if (validateNum == null || validateNum.Trim() == String.Empty)
        {
            return;
        }

        //生成Bitmap图像
       Bitmap image = new Bitmap(validateNum.Length * 12+10 , 30);
       Graphics g = Graphics.FromImage(image);
       try
       {
           //生成随机生成器
           Random random = new Random();
           //清空图片背景色
           g.Clear(Color.White);
           //话图片的背景噪音线
           for (int 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.Coral), x1, y1, x2, y2);//绘制背景噪音线
           }
           //设置背景字体样式
           Font font = new Font("Arial", 15, (FontStyle.Bold | FontStyle.Italic));
           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(validateNum, font, brush,2,2);
           //画图片的前景噪音点
           for (int i = 0; i < 100; i++)
           {
               //确定前景噪音点的位置
               int x = random.Next(image.Width);
               int 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);
           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());            //执行保存图片的操作
       }
       finally                              //无论代码中是否有错误,都执行Finally的程序代码
       {
           g.Dispose();                                                 //关闭g对象
           image.Dispose();                                         //关闭image对象
       }
    }
}
protected void btnLogin_Click(object sender, EventArgs e)
    {
        try
        {
            //判断用户名、密码、验证码的输入不能为空
            if (txtUserName.Text == "" || txtUserPass.Text == "" || txtValidNums.Text == "")
            {
                this.Page.RegisterStartupScript("ss", "<script>alert('用户名、密码或验证码不能为空!’');</script>");
                return;
            }
            else
            {
                string num = txtValidNums.Text.Trim();//获取验证码信息
                //判断输入的验证码是否正确
                if (Session["ValidNums"].ToString() == num.ToUpper())
                {
                    //连接数据库
                    SQLServer db = new SQLServer();

我的登录页面login.aspx放验证码的地方是用image控件,ImageUrl="~/ValidNums.aspx"。
验证输入时用的是:在login.aspx.cs里
string num = txtValidNums.Text.Trim();//获取验证码信息
//判断输入的验证码是否正确
if (Session["ValidNums"].ToString() == num.ToUpper())

小余儿的主页 小余儿 | 初学一级 | 园豆:191
提问于:2013-11-14 11:58
< >
分享
最佳答案
0

有两个地方需要改一下:

1、

if (!IsPostBack)
{
string validateNum = CreateRanjdomNum(4); //成生4位随机字符串
Session["ValidNums"] = validateNum; //保存验证码
CreateIamge(validateNum); //将生成的随机字符串绘成图片
}

原因:Response.BinaryWrite(ms.ToArray());后面的存session的代码不会在执行了。

2、

string num = txtValidNums.Text.Trim();//获取验证码信息
//判断输入的验证码是否正确
if (Session["ValidNums"].ToString().Replace(" ","").ToUpper() == num.ToUpper())
{

}

原因:生成验证码时每个字符之间有空格(或者allchar中的空格删除掉)

收获园豆:6
junjieok | 小虾三级 |园豆:779 | 2013-11-14 21:18

提交的时候验证码又请了一次

小余儿 | 园豆:191 (初学一级) | 2013-11-14 21:48

@小余儿:  没有取到session的问题是要 继承 IHttpHandler,IRequiresSessionState这两个接口。

提交完成时 页面postback了(页面刷新了),会重新加载图片,所以验证码又请求了一次!

junjieok | 园豆:779 (小虾三级) | 2013-11-15 09:11
其他回答(2)
0

断点跟一下吧。看下提交的时候,生成Session的代码是否又执行了一次。

收获园豆:4
幻天芒 | 园豆:37207 (高人七级) | 2013-11-14 13:11

提交的时候验证码又请了一次,咋解决呢!

支持(0) 反对(0) 小余儿 | 园豆:191 (初学一级) | 2013-11-14 21:49

@小余儿: 看你的代码,你是提交到了一般处理程序啊?这个一般处理程序需要实现Session相关的接口。

支持(1) 反对(0) 幻天芒 | 园豆:37207 (高人七级) | 2013-11-15 00:50
0

是不是缓存了?

收获园豆:2
wolfy | 园豆:2636 (老鸟四级) | 2013-11-14 13:33
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册