动态生成验证码

刺骨的言语ヽ痛彻心扉 2022-06-04 09:41 298阅读 0赞

动态生成验证码在很多地方可以用到,最近在学习牛腩视频的时候,正好看到了,就此简单总结一下。

为了简单方便,我们新建一个验证码测试的项目名为test,然后在项目中新建一个文件夹,在这个文件夹中添加一个“一般处理程序”页,命名为WaterMark.ashx ,效果如下:

SouthEast

WaterMark.ashx中的代码如下所示:

  1. <%@ WebHandler Language="C#" Class="WaterMark" %>
  2. using System;
  3. using System.Web;
  4. using System.Drawing;
  5. using System.Drawing.Drawing2D;
  6. using System.Web.SessionState;
  7. public class WaterMark : IHttpHandler, IRequiresSessionState // 要使用session必须实现该接口,记得要导入System.Web.SessionState命名空间
  8. {
  9. public void ProcessRequest(HttpContext context)
  10. {
  11. string checkCode = GenCode(5); // 产生5位随机字符
  12. context.Session["Code"] = checkCode; //将字符串保存到Session中,以便需要时进行验证
  13. System.Drawing.Bitmap image = new System.Drawing.Bitmap(70, 22);
  14. Graphics g = Graphics.FromImage(image);
  15. try
  16. {
  17. //生成随机生成器
  18. Random random = new Random();
  19. //清空图片背景色
  20. g.Clear(Color.White);
  21. // 画图片的背景噪音线
  22. int i;
  23. for (i = 0; i < 25; i++)
  24. {
  25. int x1 = random.Next(image.Width);
  26. int x2 = random.Next(image.Width);
  27. int y1 = random.Next(image.Height);
  28. int y2 = random.Next(image.Height);
  29. g.DrawLine(new Pen(Color.Silver), x1, y1, x2, y2);
  30. }
  31. Font font = new System.Drawing.Font("Arial", 12, (System.Drawing.FontStyle.Bold));
  32. 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);
  33. g.DrawString(checkCode, font, brush, 2, 2);
  34. //画图片的前景噪音点
  35. g.DrawRectangle(new Pen(Color.Silver), 0, 0, image.Width - 1, image.Height - 1);
  36. System.IO.MemoryStream ms = new System.IO.MemoryStream();
  37. image.Save(ms, System.Drawing.Imaging.ImageFormat.Gif);
  38. context.Response.ClearContent();
  39. context.Response.ContentType = "image/Gif";
  40. context.Response.BinaryWrite(ms.ToArray());
  41. }
  42. finally
  43. {
  44. g.Dispose();
  45. image.Dispose();
  46. }
  47. }
  48. /// <summary>
  49. /// 产生随机字符串
  50. /// </summary>
  51. /// <param name="num">随机出几个字符</param>
  52. /// <returns>随机出的字符串</returns>
  53. private string GenCode(int num)
  54. {
  55. string str = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
  56. char[] chastr = str.ToCharArray();
  57. string code = "";
  58. Random rd = new Random();
  59. int i;
  60. for (i = 0; i < num; i++)
  61. {
  62. code += str.Substring(rd.Next(0, str.Length), 1);
  63. }
  64. return code;
  65. }
  66. public bool IsReusable
  67. {
  68. get
  69. {
  70. return false;
  71. }
  72. }
  73. }

在Default.aspx中代码如下:

  1. <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
  2. <!DOCTYPE html>
  3. <html xmlns="http://www.w3.org/1999/xhtml">
  4. <head runat="server">
  5. <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
  6. <title>验证码实验</title>
  7. <script lang ="javascript" type ="text/javascript" >
  8. function changeCode() {
  9. var imgNode = document.getElementById("vimg");
  10. imgNode.src = "handler/WaterMark.ashx?t=" + (new Date()).valueOf();
  11. }
  12. </script>
  13. </head>
  14. <body>
  15. <form id="form1" runat="server">
  16. <div>
  17. <%--<p>验证码1:<img src="handler/WaterMark.ashx" id="vimg" alt="" οnclick="changeCode()" /></p>--%>
  18. <p>验证码2:<asp:Image ID="vimg" runat="server" ImageUrl ="handler/WaterMark.ashx" οnclick="changeCode()" /></p>
  19. </div>
  20. </form>
  21. </body>
  22. </html>

当验证输入的验证码与当前验证码是否一致时,代码如下:

  1. string code = txtCode.Text.Trim().ToUpper(); //用户输入的验证码
  2. string rightCode = Session["Code"].ToString();
  3. if (code != rightCode )
  4. {
  5. Page.ClientScript.RegisterStartupScript(Page.GetType(), "message", "<script language='javascript' defer>alert('验证码输入错误!');</script>");
  6. txtCode.Text = "";
  7. return;
  8. }

感谢您的阅读~

发表评论

表情:
评论列表 (有 0 条评论,298人围观)

还没有评论,来说两句吧...

相关阅读

    相关 动态生成验证

    动态生成验证码在很多地方可以用到,最近在学习牛腩视频的时候,正好看到了,就此简单总结一下。 为了简单方便,我们新建一个验证码测试的项目名为test,然后在项目中新建一个文件夹

    相关 验证生成

    视图函数里 > 1,导入图片,画布,画笔,画笔上的字体,定义坐标 > 2,从外部导入字体(字体导入到static静态中) > 3,随机生成验证码,验证码颜色,验证