HttpHandler对象验证码-程序员宅基地

技术标签: HttpHandler对象  web  

HttpHandler对象验证码

创建web项目添加HTTPHandler类

如图:
在这里插入图片描述
上图VerificationCode便是HttpHandler类

编写HttpHandler类,继承IHttpHandler和IRequiresSessionState‘

代码如下:

 public void ProcessRequest(HttpContext context)
        {
            // 创建一个包含随机内容的验证码文本
            Random rand = new Random();
            int len = rand.Next(4, 6);
            char[] chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ".ToCharArray();
            StringBuilder myStr = new StringBuilder();
            for (int iCount = 0; iCount < len; iCount++)
            {
                myStr.Append(chars[rand.Next(chars.Length)]);
            }
            string text = myStr.ToString();
            Size ImageSize = Size.Empty;
            Font myFont = new Font("MS Sans Serif", 20);
            // 计算验证码图片大小
            using (Bitmap bmp = new Bitmap(10, 10))
            {
                using (Graphics g = Graphics.FromImage(bmp))
                {
                    SizeF size = g.MeasureString(text, myFont, 10000);
                    ImageSize.Width = (int)size.Width + 1;
                    ImageSize.Height = (int)size.Height + 1;
                }
            }
            // 创建验证码图片
            using (Bitmap bmp = new Bitmap(ImageSize.Width, ImageSize.Height))
            {
                // 绘制验证码文本
                using (Graphics g = Graphics.FromImage(bmp))
                {
                    g.Clear(Color.White);
                    using (StringFormat f = new StringFormat())
                    {
                        f.Alignment = StringAlignment.Near;
                        f.LineAlignment = StringAlignment.Center;
                        f.FormatFlags = StringFormatFlags.NoWrap;
                        g.DrawString(
                            text,
                            myFont,
                            Brushes.Black,
                            new RectangleF(
                            0,
                            0,
                            ImageSize.Width,
                            ImageSize.Height),
                            f);
                    }
                }

                // 制造噪声 杂点面积占图片面积的 30%
                int num = ImageSize.Width * ImageSize.Height * 30 / 100;

                for (int iCount = 0; iCount < num; iCount++)
                {
                    // 在随机的位置使用随机的颜色设置图片的像素
                    int x = rand.Next(ImageSize.Width);
                    int y = rand.Next(ImageSize.Height);
                    int r = rand.Next(255);
                    int g = rand.Next(255);
                    int b = rand.Next(255);
                    Color c = Color.FromArgb(r, g, b);
                    bmp.SetPixel(x, y, c);
                }

                // 输出图片
                System.IO.MemoryStream ms = new System.IO.MemoryStream();
                bmp.Save(ms, System.Drawing.Imaging.ImageFormat.Gif);
                context.Response.ContentType = "image/Gif";
                context.Session["CheckCode"] = text;
                ms.WriteTo(context.Response.OutputStream);
                ms.Close();
            }
            myFont.Dispose();
        }
        public bool IsReusable
        {
            get
            {
                return false;
            }

编写视图层代码

代码如下:

<body>
    <form id="form1" runat="server">
        <div>
            <table style="width:100%;" border="1" cellspacing="0" cellpadding="0">
                <tr>
                    <td>账号</td>
                    <td><asp:TextBox ID="txtAccount" runat="server"></asp:TextBox></td>
                </tr>
                <tr>
                    <td>密码</td>
                    <td><asp:TextBox ID="txtPwd" runat="server" TextMode="Password"></asp:TextBox></td>
                </tr>
                <tr>
                    <td>验证码</td>
                    <td>
                        <asp:TextBox ID="txtCode" runat="server"></asp:TextBox>
                        <asp:Image ID="Image1" runat="server" ImageUrl="~/VerificationCode.cs" />
                        <asp:LinkButton ID="LinkButton1" runat="server">刷新</asp:LinkButton>
                    </td>
                </tr>
            </table>
            <asp:Button ID="btnSubmit" runat="server" Text="提交" style="margin-left:50%; margin-top:2%" OnClick="btnSubmit_Click" />
        </div>
        <asp:Label ID="lblMessge" runat="server" Text=""></asp:Label>
    </form>
</body>

这是视图层前台代码

编写视图层后台代码

protected void Page_Load(object sender, EventArgs e)
        {

        }

        protected void btnSubmit_Click(object sender, EventArgs e)
        {
            if (System.Web.HttpContext.Current.Session["CheckCode"] != null)
            {
                lblMessge.Text = System.Web.HttpContext.Current.Session["CheckCode"] as string;
                Console.WriteLine("登录成功");
            }
            else
            {
                lblMessge.Text = "验证码不正确";
            }
        }
    }

记住一个点记得写配置文件
代码如下

<system.webServer>
		<handlers>
			<add verb="*" path="WebApplication2/*.aspx" name="handler" type="WebApplication2.VerificationCode"/>
		</handlers>
	</system.webServer>
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/m0_49928665/article/details/117525665

智能推荐

C++ stringstream的用法-程序员宅基地

文章浏览阅读5.3k次,点赞2次,收藏6次。使用stringstream对象简化类型转换C++标准库中的&lt;sstream&gt;提供了比ANSI C的&lt;stdio.h&gt;更高级的一些功能,即单纯性、类型安全和可扩展性。在本文中,我将展示怎样使用这些库来实现安全和自动的类型转换。为什么要学习如果你已习惯了&lt;stdio.h&gt;风格的转换,也许你首先会问:为什么要花额外的精力来学习基于&lt;sstream&g..._stringstream

Python爬虫-pyspider框架的使用_response.doc-程序员宅基地

文章浏览阅读1.5k次。pyspider 是一个用python实现的功能强大的网络爬虫系统,能在浏览器界面上进行脚本的编写,功能的调度和爬取结果的实时查看,后端使用常用的数据库进行爬取结果的存储,还能定时设置任务与任务优先级等。本篇文章只是对这个框架使用的大体介绍,更多详细信息可见官方文档。安装首先是环境的搭建,网上推荐的各种安装命令,如: pip install pyspider但是因为各种权限的..._response.doc

vue + blockly 自定义块、工具箱、主题_blockly vue-程序员宅基地

文章浏览阅读3.2k次。vue + blockly 自定义块、工具箱、主题自定义块建议使用 Blockly Developer Tools 方便而且选择多样,随时生成块代码。自定义块块由三个组件组成:块定义对象:定义块的外观和行为,包括文本、颜色、字段和连接。工具箱引用:对工具箱 XML 中块类型的引用,因此用户可以将其添加到工作区。生成器函数:生成此块的代码字符串。它总是用 JavaScript 编写,即使目标语言不是 JavaScript。通过 Blockly Developer Tools _blockly vue

笔记本显卡排名-程序员宅基地

文章浏览阅读158次。最新笔记本显卡性能排名总表最新笔记本显卡性能排名总表以下排名整理自国外网站,以性能排名,越往前性能越好第一梯队:高端显卡GeForce GTX 280M SLIMobility Radeon HD 4870 X2GeForce GTX 260M SLIGeForce 9800M GTX SLIGeForce GTX 280MGeForce 9800M G..._mobility radeon x700 win98

python中文显示不出来_解决Python词云库wordcloud不显示中文的问题-程序员宅基地

文章浏览阅读2.6k次。解决Python词云库wordcloud不显示中文的问题2018-11-25背景:wordcloud是基于Python开发的词云生成库,功能强大使用简单。github地址:https://github.com/amueller/word_cloudwordcloud默认是不支持显示中文的,中文会被显示成方框。安装:安装命令:pip install wordcloud解决:经过测试发现不支持显示中文..._词云python代码无法输出文字

随便推点

完成SSH项目 -- 实现dao层_ssh框架service层调用dao有的能创建成功-程序员宅基地

文章浏览阅读1.6k次。现在web02项目有了controller 和 service 但还没有dao层,接下来我们就整合dao层1:配置数据源 --- 使用c3p0数据源_ssh框架service层调用dao有的能创建成功

在.net下将word文档转换为加有水印pdf文档_.net webapi word pdf添加水印 开源-程序员宅基地

文章浏览阅读725次。前两天在.net平台下要做一个管理系统,其中要用到一个功能就是将word文档转换为加有水印的pdf文档。在网上找了不少代码,贴出来给大家分享一下。 所需软件:word2007 + 微软的SaveAsPDFandXPS.exe(下载地址为http://download.micros_.net webapi word pdf添加水印 开源

解决openweather无法注册的问题_openweather api 创建账户被禁止了-程序员宅基地

文章浏览阅读5.5k次。1.问题说明openweather注册不成功,无法进行机器人验证2.解决方法无法收到谷歌提供的机器人验证信息,科学上网可解决。科学上网用来注册,后续登录和获取数据不需要,直接访问即可。_openweather api 创建账户被禁止了

winscp通过跳板机访问远程服务器(使用秘钥的方式传输文件)_winscp 隧道 跳板机上的密码-程序员宅基地

文章浏览阅读4.7k次,点赞2次,收藏4次。一般需要ssh两个账户或两个设备才能有权限传输数据时经常遇到下面情况:我们一般连接跳板机使用的用户权限很小,能访问的文件不多,要是我想传输数据到我的设备上,却必须用跳板机连接设备怎么办?(别告诉我先在设备上搭个FTP服务器)下载winscp: 下载地址https://winscp.net/eng/downloads.php然后傻瓜式安装一键到底安装好就是配置访问服务器1、直接..._winscp 隧道 跳板机上的密码

从C++到Java(一)_enum c++ java-程序员宅基地

文章浏览阅读1.3k次。JAVA语言概括和基本类型,数组,枚举_enum c++ java

网络学习第六天(路由器、VLAN)_路由和vlan-程序员宅基地

文章浏览阅读316次。路由的概念路由器它称之为网关设备。路由器就是用于连接不同网络的设备路由器是位于OSI模型的第三层。路由器通过路由决定数据的转发。网关的背景:当时每家计算机厂商,用于交换数据的通信程序(协议)和数据描述格式各不相同。因此,就把用于相互转换这些协议和格式的计算机称为网关。路由器与三层交换器的对比路由协议对比路由器的作用:1.路由寻址2.实现不同网络之间相连的功能3.通过路由决定数据的转发,转发策略称为 路由选择。VLAN相关技术什么是VLAN?中文名称叫:虚拟局域网。虚_路由和vlan

推荐文章

热门文章

相关标签