handler实现计算式的验证码 电脑版发表于:2019/8/14 17:06 [handler实现一个简单的验证码](https://www.tnblog.net/aojiancc2/article/details/2567) 就是一个很简单的计算式验证码: ![](https://img.tnblog.net/arcimg/aojiancc2/b4d78113e38d4943b67309f6379e5fa6.jpg) 其实这种验证码很简单,就是随机参数两个数字在随机一下计算的方法即可,代码如下: ``` public class NumberCheckHandler : IHttpHandler, IRequiresSessionState { public void ProcessRequest(HttpContext context) { context.Response.ContentType = "text/plain"; //创建一个空的图片 Bitmap bitmap = new Bitmap(100, 40); //根据图片创建一个画图的工具类 Graphics graphics = Graphics.FromImage(bitmap); Font font = new Font("宋体", 15); SolidBrush solidBrush = new SolidBrush(Color.White); graphics.FillRectangle(new SolidBrush(Color.Black), 0, 0, 100, 36); //随机,大小写,数字 List<int> codeList = new List<int>(); //大小写的范围 for (int i = 97, j = 65; i < 123; i++, j++) { codeList.Add(i); codeList.Add(j); } //数字 for (int i = 48; i < 58; i++) { codeList.Add(i); } Random random = new Random(); int number1 = random.Next(1, 30); int number2 = random.Next(1, 30); //存放算式的键值对 Dictionary<int, string> dic = new Dictionary<int, string>(); dic.Add(1, "+"); dic.Add(2, "-"); dic.Add(3, "*"); //存放结果的键值对 Dictionary<int, int> dic_result = new Dictionary<int, int>(); dic_result.Add(1, number1 + number2); dic_result.Add(2, number1 - number2); dic_result.Add(3, number1 * number2); //随机取一种算法 int type = random.Next(1, 4); //计算式 string cal = number1 + dic[type] + number2 + "=?"; //把图片验证码的结果存储在session,为了方便进行和用户输入内容匹配 context.Session["code"] = dic_result[type]; graphics.DrawString(cal, font, solidBrush, 25, 8); Pen pen = new Pen(solidBrush, 1); //产生干扰-三条直线 //for (int i = 0; i < 4; i++) //{ // graphics.DrawLine(pen, random.Next(0, 100), random.Next(0, 36), random.Next(0, 100), random.Next(0, 36)); //} ////产生干扰-生成更小的随机内容 //for (int i = 0; i < 8; i++) //{ // int ranIndex = random.Next(0, codeList.Count); // char rchar = (char)codeList[ranIndex]; // graphics.DrawString(rchar + "", new Font("宋体", 8), solidBrush, random.Next(0, 100), random.Next(0, 36)); //} //输出图片 bitmap.Save(context.Response.OutputStream, System.Drawing.Imaging.ImageFormat.Jpeg); } public bool IsReusable { get { return false; } } } ``` 但是这里还是想说一下,就是我们常规的做法是很喜欢判断,比如判断如果是加应该怎么做,如果是减又会怎么做,这里我们说一下怎么不用判断来实现这个东西其实就是键值对就行了, ![](https://img.tnblog.net/arcimg/aojiancc2/6016fa2f3fae40e0a151463087f051ff.jpg) 我这里用了两个键值对,一个存放算式用来显示给用户,一个存放结果用户自己存储在session里边方便和用户输入的对比。其实用一个键值对也可以的,把值存储一个对象,包含这两个值就行了,或者使用lambda也行,但是这里更应该思考一下如何不使用lamdba也能做到