using System; using System.Collections.Generic; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using System.Drawing; namespace SmartWaterSys.Web { public partial class ValidateCode : System.Web.UI.Page { private void Page_Load(object sender, System.EventArgs e) { string checkCode = GetRandomCode(4); Session["CheckCode"] = checkCode; SetPageNoCache(); CreateImage(checkCode); } /// <summary> /// 设置页面不被缓存 /// </summary> private void SetPageNoCache() { Response.Buffer = true; Response.ExpiresAbsolute = System.DateTime.Now.AddSeconds(-1); Response.Expires = 0; Response.CacheControl = "no-cache"; Response.AppendHeader("Pragma", "No-Cache"); } private string CreateRandomCode(int codeCount) { string allChar = "0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F,G,H,i,J,K,M,N,P,Q,R,S,T,U,W,X,Y,Z"; string[] allCharArray = allChar.Split(','); string randomCode = ""; int temp = -1; Random rand = new Random(); for (int i = 0; i < codeCount; i++) { if (temp != -1) { rand = new Random(i * temp * ((int)DateTime.Now.Ticks)); } int t = rand.Next(35); if (temp == t) { return CreateRandomCode(codeCount);//性能问题 } temp = t; randomCode += allCharArray[t]; } return randomCode; } private string GetRandomCode(int CodeCount) { string allChar = "0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F,G,H,i,J,K,M,N,P,Q,R,S,T,U,W,X,Y,Z"; string[] allCharArray = allChar.Split(','); string RandomCode = ""; int temp = -1; Random rand = new Random(); for (int i = 0; i < CodeCount; i++) { if (temp != -1) { rand = new Random(temp * i * ((int)DateTime.Now.Ticks)); } int t = rand.Next(33); while (temp == t) { t = rand.Next(33); } temp = t; RandomCode += allCharArray[t]; } return RandomCode; } private void CreateImage(string checkCode) { int iwidth = (int)(checkCode.Length * 14); System.Drawing.Bitmap image = new System.Drawing.Bitmap(iwidth, 20); Graphics g = Graphics.FromImage(image); Font f = new System.Drawing.Font("Arial ", 10);//, System.Drawing.FontStyle.Bold); Brush b = new System.Drawing.SolidBrush(Color.Black); Brush r = new System.Drawing.SolidBrush(Color.FromArgb(166, 8, 8)); //g.FillRectangle(new System.Drawing.SolidBrush(Color.Blue),0,0,image.Width, image.Height); // g.Clear(Color.AliceBlue);//背景色 g.Clear(System.Drawing.ColorTranslator.FromHtml("#99C1CB"));//背景色 char[] ch = checkCode.ToCharArray(); for (int i = 0; i < ch.Length; i++) { if (ch[i] >= '0' && ch[i] <= '9') { //数字用红色显示 g.DrawString(ch[i].ToString(), f, r, 3 + (i * 12), 3); } else { //字母用黑色显示 g.DrawString(ch[i].ToString(), f, b, 3 + (i * 12), 3); } } //for循环用来生成一些随机的水平线 // Pen blackPen = new Pen(Color.Black, 0); // Random rand = new Random(); // for (int i=0;i<5;i++) // { // int y = rand.Next(image.Height); // g.DrawLine(blackPen,0,y,image.Width,y); // } System.IO.MemoryStream ms = new System.IO.MemoryStream(); image.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg); //history back 不重复 Response.Cache.SetNoStore();//这一句 Response.ClearContent(); Response.ContentType = "image/Jpeg"; Response.BinaryWrite(ms.ToArray()); g.Dispose(); image.Dispose(); } } }
百度了一下,应该是为了解决获取验证码前后一致的问题,因为缓存会使数据保存,而验证码恰好不需要保存而是需要更新,所以取消缓存。
因为你每次动态生成的验证码的文件名都是一样的,比如是:img.jpg 那么系统就缓存了,下次再调用这个页面的时候ie会认为存在这个图片不会更新。导致验证码不对。