• ValidateCode.cs验证码时设置缓存的使用


    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会认为存在这个图片不会更新。导致验证码不对。
  • 相关阅读:
    面试经验链接汇集
    258. Add Digits
    192. Word Frequency(shell)
    6、字符串循环对角线结构ZigZag Conversion
    5、最长回文子串Longest Palindromic Substring
    idea常用的快捷命令
    JAVA传输概念
    UUID随机字符串
    Bean的加载
    默认标签的解析过程(三)parseDefaultElement
  • 原文地址:https://www.cnblogs.com/sherlockholmes/p/5286983.html
Copyright © 2020-2023  润新知