我产生验证码的是一个叫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页面载入。
求高手指点,新手分不多。请不要怀疑我的诚意。
试试在 ImageUrl 中加上随机数参数:
ImageUrl="~/ValidNums.aspx?id=随机数"
我用了产生GUID附加给id后实现了局部刷新验证码,但是还是无法解决Session里显示的跟演示的不同步问题
你的验证码是放在SESSION中的?这个不好,最好放在COOKIE中,而且还要加上时间标签,或者把验证码放在页面的HIDDEN域里(当然,最好做个编码保密)
验证码存储在Session应该没有什么问题!我也一直存储在session中,都没出现这种问题!你代码能不能再贴全一点!
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();
平我的估测有两种:
1.是2次请求
2.浏览器缓存
建议:
生成随机参数 aspx?num=E2BDad
或者主动清除浏览器缓存。
还需要判断是否页面多次加载和请求。
用了生成随机参数的,也清理的缓存,还是不行。至于两次请求是什么意思。就算两次请求也也该没问题三。它请求一次就修改一次Session(代码已附上。)
@泰晤士河边的斜:
string validateNum = CreateRanjdomNum(4); //成生4位随机字符串
CreateIamge(validateNum); //将生成的随机字符串绘成图片
Session["ValidNums"] = validateNum;
最写个方法。
不要放在load事件里面
你那两个问题咋解决的呢!我现在也遇到了这两个问题的说!