应无所住,而生其心
排名
1
文章
860
粉丝
112
评论
163
net core webapi post传递参数
庸人 : 确实坑哈,我也是下班好了好几次,发现后台传递对象是可以的,但...
百度编辑器自定义模板
庸人 : 我建议换个编辑器,因为现在百度富文本已经停止维护了,用tinymec...
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术

handler实现计算式的验证码

5967人阅读 2019/8/14 17:06 总访问:5194351 评论:0 收藏:0 手机
分类: .NET

handler实现一个简单的验证码

就是一个很简单的计算式验证码:

其实这种验证码很简单,就是随机参数两个数字在随机一下计算的方法即可,代码如下:

  1. public class NumberCheckHandler : IHttpHandler, IRequiresSessionState
  2. {
  3. public void ProcessRequest(HttpContext context)
  4. {
  5. context.Response.ContentType = "text/plain";
  6. //创建一个空的图片
  7. Bitmap bitmap = new Bitmap(100, 40);
  8. //根据图片创建一个画图的工具类
  9. Graphics graphics = Graphics.FromImage(bitmap);
  10. Font font = new Font("宋体", 15);
  11. SolidBrush solidBrush = new SolidBrush(Color.White);
  12. graphics.FillRectangle(new SolidBrush(Color.Black), 0, 0, 100, 36);
  13. //随机,大小写,数字
  14. List<int> codeList = new List<int>();
  15. //大小写的范围
  16. for (int i = 97, j = 65; i < 123; i++, j++)
  17. {
  18. codeList.Add(i);
  19. codeList.Add(j);
  20. }
  21. //数字
  22. for (int i = 48; i < 58; i++)
  23. {
  24. codeList.Add(i);
  25. }
  26. Random random = new Random();
  27. int number1 = random.Next(1, 30);
  28. int number2 = random.Next(1, 30);
  29. //存放算式的键值对
  30. Dictionary<int, string> dic = new Dictionary<int, string>();
  31. dic.Add(1, "+");
  32. dic.Add(2, "-");
  33. dic.Add(3, "*");
  34. //存放结果的键值对
  35. Dictionary<int, int> dic_result = new Dictionary<int, int>();
  36. dic_result.Add(1, number1 + number2);
  37. dic_result.Add(2, number1 - number2);
  38. dic_result.Add(3, number1 * number2);
  39. //随机取一种算法
  40. int type = random.Next(1, 4);
  41. //计算式
  42. string cal = number1 + dic[type] + number2 + "=?";
  43. //把图片验证码的结果存储在session,为了方便进行和用户输入内容匹配
  44. context.Session["code"] = dic_result[type];
  45. graphics.DrawString(cal, font, solidBrush, 25, 8);
  46. Pen pen = new Pen(solidBrush, 1);
  47. //产生干扰-三条直线
  48. //for (int i = 0; i < 4; i++)
  49. //{
  50. // graphics.DrawLine(pen, random.Next(0, 100), random.Next(0, 36), random.Next(0, 100), random.Next(0, 36));
  51. //}
  52. ////产生干扰-生成更小的随机内容
  53. //for (int i = 0; i < 8; i++)
  54. //{
  55. // int ranIndex = random.Next(0, codeList.Count);
  56. // char rchar = (char)codeList[ranIndex];
  57. // graphics.DrawString(rchar + "", new Font("宋体", 8), solidBrush, random.Next(0, 100), random.Next(0, 36));
  58. //}
  59. //输出图片
  60. bitmap.Save(context.Response.OutputStream, System.Drawing.Imaging.ImageFormat.Jpeg);
  61. }
  62. public bool IsReusable
  63. {
  64. get
  65. {
  66. return false;
  67. }
  68. }
  69. }

但是这里还是想说一下,就是我们常规的做法是很喜欢判断,比如判断如果是加应该怎么做,如果是减又会怎么做,这里我们说一下怎么不用判断来实现这个东西其实就是键值对就行了,

我这里用了两个键值对,一个存放算式用来显示给用户,一个存放结果用户自己存储在session里边方便和用户输入的对比。其实用一个键值对也可以的,把值存储一个对象,包含这两个值就行了,或者使用lambda也行,但是这里更应该思考一下如何不使用lamdba也能做到


欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739。有需要软件开发,或者学习软件技术的朋友可以和我联系~(Q:815170684)

评价

handler画图制作图片水印

handler画图制作图片水印,版权申明什么的,直接上代码publicvoidProcessRequest(HttpContextcontext) { context.Respons...

在WEB API中进行统一安全验证类Delegatinghandler

根据web api 官方参考文献 总结出一下代码举例:将 HTTP 响应消息的处理委托给另一处理程序(称为“内部处理程序”)的 HTT...

handler实现一个简单的验证码

handler代码如下:publicclassCodeHandler:IHttpHandler,IRequiresSessionState { publicvoidProcessRequest(HttpConte...

httphandler一般处理程序的配置

单个具体页面的配置方法: &lt;system.webServer&gt; &lt;handlers&gt; &lt;add name=&quot;hander&quot; pat...