C# 一般处理程序ashx用于验证码

1、用VS2019建立一个web应用程序,选mvc模板

2、选中项目邮件新建文件夹Webservice,然后添加一般处理程序Verify.ashx然后右键打开改写如下

 1  public class VerifyCode : IHttpHandler, IRequiresSessionState
 2     {
 3 
 4         public bool IsReusable { get { return false; } }
 5         private const int width = 90;
 6         private const int height = 30;
 7         public void ProcessRequest(HttpContext context)
 8         {
 9             context.Response.Cache.SetCacheability(HttpCacheability.NoCache);
10             context.Response.ClearContent();
11             context.Response.ContentType = "image/Png";
12             context.Response.BinaryWrite(CreateImg(ExfSoft.Common.SecurityUtil.CreateNew(4, true)));
13             context.Response.End();
14         }
15 
16         private byte[] CreateImg(string VerifyCode)
17         {
18             //这个宽高可以根据需要确定 
19             System.Drawing.Bitmap image = new Bitmap(width, height);
20             //创建图形
21             Graphics g = Graphics.FromImage(image);
22             //创建RectangleF结构指定一个区域
23             RectangleF rectangle = new RectangleF(0, 0, image.Width, image.Height);
24             g.FillRectangle(new SolidBrush(Color.FromArgb(255, 255, 255)), rectangle);
25 
26             //背景噪音线
27             System.Random random = new Random();
28             for (int i = 0; i < 15; i++)
29             {
30                 int x1 = random.Next(width);
31                 int x2 = random.Next(width);
32                 int y1 = random.Next(height);
33                 int y2 = random.Next(height);
34                 g.DrawLine(new Pen(Color.FromArgb(random.Next())), x1, y1, x2, y2);
35             }
36             Font font = new Font("Arial", 14, (System.Drawing.FontStyle.Bold | System.Drawing.FontStyle.Italic));
37             LinearGradientBrush brush = new LinearGradientBrush(new Rectangle(0, 0, width, height), Color.Blue, Color.DarkRed, 1.2f, true);
38 
39             var chars = new List<Char>();
40             foreach (char s in VerifyCode)
41             {
42                 chars.Add(s);
43             }
44 
45             g.DrawString(String.Join(" ", chars.ToArray()), font, brush, 10, 5);
46 
47             //画图片的前景噪音点
48             for (int i = 0; i < 50; i++)
49             {
50                 int x = random.Next(width);
51                 int y = random.Next(height);
52                 image.SetPixel(x, y, Color.FromArgb(random.Next()));
53             }
54             //画图片的边框线
55             g.DrawRectangle(new Pen(Color.FromArgb(255, 153, 193, 226)), 0, 0, image.Width - 1, image.Height - 1);
56 
57             MemoryStream ms = new MemoryStream();
58             //选择透明格式
59             image.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
60             //原本是准备输出html流,现在输出图信数据,所以要修改http头
61             return ms.ToArray();
62         }
63     }

3、任意找一个页面如Index.cshtml,添加图片控件和Jquery代码

<img id="verifycode_img" src="/webservice/verifycode.ashx" onclick="" style="vertical-align: middle; margin-left: 10px;" />
<script>
    $(function () {
        $("#verifycode_img").click(function () {
            $(this).attr('src', '/WebService/VerifyCode.ashx?t=' + new Date())
        })
    })
</script>

4、效果,点击图片验证码将会做相应变化

 

 5、配合input框提交到后台Action里面通过,ExfSoft.Common.SecurityUtil.IsValid("验证码字符串")方法,即可以实现登录验证码功能。

posted @ 2020-07-11 12:23  摩诘  阅读(692)  评论(0编辑  收藏  举报