首页 新闻 会员 周边 捐助

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

0
悬赏园豆:20 [已解决问题] 解决于 2012-05-31 18:25

我产生验证码的是一个叫ValidNums.aspx文件,ValidNums.aspx.cs里有三个方法
1. //生成随机字符串
private string CreateRanjdomNum(int NumCount)
2. //生成图片
private void CreateIamge(string validateNum)
3. //载入ValidNums.aspx页面时调用这两个方法产生验证码并把验证码字符串validateNum存入Session
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
string validateNum = CreateRanjdomNum(4); //成生4位随机字符串
CreateIamge(validateNum); //将生成的随机字符串绘成图片
Session["ValidNums"] = validateNum; //保存验证码
}
}

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

 

 

问题1:无论我怎样输入验证码都不对。然后我用label控件在载入login.aspx页面时就将Session里的内容显示出来时。
发现Session里的内容跟验证码那儿显示的不一样。

问题2:解决这个问题后,我该如和实现验证码的单独刷新?因为验证码是一个单独的.aspx的文件,好单独在login页面载入。

求高手指点,新手分不多。请不要怀疑我的诚意。

问题补充:

自己解决了。还是谢谢各位大牛,现在结贴三分。

泰晤士河边的斜的主页 泰晤士河边的斜 | 初学一级 | 园豆:154
提问于:2012-05-31 01:07
< >
分享
最佳答案
0

试试在 ImageUrl 中加上随机数参数:

ImageUrl="~/ValidNums.aspx?id=随机数"

收获园豆:8
dudu | 高人七级 |园豆:29568 | 2012-05-31 08:49

我用了产生GUID附加给id后实现了局部刷新验证码,但是还是无法解决Session里显示的跟演示的不同步问题

泰晤士河边的斜 | 园豆:154 (初学一级) | 2012-05-31 13:33
其他回答(4)
0

你的验证码是放在SESSION中的?这个不好,最好放在COOKIE中,而且还要加上时间标签,或者把验证码放在页面的HIDDEN域里(当然,最好做个编码保密)

收获园豆:3
无之无 | 园豆:5095 (大侠五级) | 2012-05-31 08:47
0

验证码存储在Session应该没有什么问题!我也一直存储在session中,都没出现这种问题!你代码能不能再贴全一点!

收获园豆:1
xu_happy_you | 园豆:222 (菜鸟二级) | 2012-05-31 09:28

ValidNums.aspx.cs内的:

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对象
       }
    }
}

 

login.aspx验证验证码时的部分代码为:

   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();
支持(0) 反对(0) 泰晤士河边的斜 | 园豆:154 (初学一级) | 2012-05-31 13:41
0

平我的估测有两种:

1.是2次请求

2.浏览器缓存

建议:

生成随机参数 aspx?num=E2BDad

或者主动清除浏览器缓存。

还需要判断是否页面多次加载和请求。

收获园豆:8
Mundo Novo | 园豆:69 (初学一级) | 2012-05-31 09:40

用了生成随机参数的,也清理的缓存,还是不行。至于两次请求是什么意思。就算两次请求也也该没问题三。它请求一次就修改一次Session(代码已附上。)

支持(0) 反对(0) 泰晤士河边的斜 | 园豆:154 (初学一级) | 2012-05-31 13:51

@泰晤士河边的斜: 

          string validateNum = CreateRanjdomNum(4);          //成生4位随机字符串
            CreateIamge(validateNum);                         //将生成的随机字符串绘成图片
            Session["ValidNums"] = validateNum;   
最写个方法。

不要放在load事件里面

支持(0) 反对(0) Mundo Novo | 园豆:69 (初学一级) | 2012-06-27 13:39
0

你那两个问题咋解决的呢!我现在也遇到了这两个问题的说!

小余儿 | 园豆:191 (初学一级) | 2013-11-13 19:12
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册