asp.net生成验证码并提交验证

简介: asp.net生成验证码并提交验证

一般处理程序(WaterMark.ashx)中代码


using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Web;
using System.Web.SessionState;
/*
 * 创建人:张自由
 * 时间:2020-09-14
 * 用途:随机生成验证码
 */
namespace Web.handler
{
    public class WaterMark : IHttpHandler, IRequiresSessionState  // 要使用session必须实现该接口,记得要导入System.Web.SessionState命名空间
    {
        public void ProcessRequest(HttpContext context)
        {
            string checkCode = GenCode(5);  // 产生5位随机字符
            context.Session["Code"] = checkCode; //将字符串保存到Session中,以便需要时进行验证
            System.Drawing.Bitmap image = new System.Drawing.Bitmap(70, 22);
            Graphics g = Graphics.FromImage(image);
            try
            {
                //生成随机生成器
                Random random = new Random();
                //清空图片背景色
                g.Clear(Color.White);
                // 画图片的背景噪音线
                int i;
                for (i = 0; i < 25; i++)
                {
                    int x1 = random.Next(image.Width);
                    int x2 = random.Next(image.Width);
                    int y1 = random.Next(image.Height);
                    int y2 = random.Next(image.Height);
                    g.DrawLine(new Pen(Color.Silver), x1, y1, x2, y2);
                }
                Font font = new System.Drawing.Font("Arial", 12, (System.Drawing.FontStyle.Bold));
                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);
                g.DrawString(checkCode, font, brush, 2, 2);
                //画图片的前景噪音点
                g.DrawRectangle(new Pen(Color.Silver), 0, 0, image.Width - 1, image.Height - 1);
                System.IO.MemoryStream ms = new System.IO.MemoryStream();
                image.Save(ms, System.Drawing.Imaging.ImageFormat.Gif);
                context.Response.ClearContent();
                context.Response.ContentType = "image/Gif";
                context.Response.BinaryWrite(ms.ToArray());
            }
            finally
            {
                g.Dispose();
                image.Dispose();
            }
        }
        /// <summary>
        /// 产生随机字符串
        /// </summary>
        /// <param name="num">随机出几个字符</param>
        /// <returns>随机出的字符串</returns>
        private string GenCode(int num)
        {
            string str = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";//"的一是在不了有和人这中大为上个国我以要他时来用们生到作地于出就分对成会可主发年动同工也能下过子说产种面而方后多定行学法所民得经十三之进着等部度家电力里如水化高自二理起小物现实加量都两体制机当使点从业本去把性好应开它合还因由其些然前外天政四日那社义事平形相全表间样与关各重新线内数正心反你明看原又么利比或但质气第向道命此变条只没结解问意建月公无系军很情者最立代想已通并提直题党程展五果料象员革位入常文总次品式活设及管特件长求老头基资边流路级少图山统接知较将组见计别她手角期根论运农指几九区强放决西被干做必战先回则任取据处队南给色光门即保治北造百规热领七海口东导器压志世金增争济阶油思术极交受联什认六共权收证改清己美再采转更单风切打白教速花带安场身车例真务具万每目至达走积示议声报斗完类八离华名确才科张信马节话米整空元况今集温传土许步群广石记需段研界拉林律叫且究观越织装影算低持音众书布复容儿须际商非验连断深难近矿千周委素技备半办青省列习响约支般史感劳便团往酸历市克何除消构府称太准精值号率族维划选标写存候毛亲快效斯院查江型眼王按格养易置派层片始却专状育厂京识适属圆包火住调满县局照参红细引听该铁价严";
            char[] chastr = str.ToCharArray();
            // string[] source ={ "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "#", "$", "%", "&", "@" };
            string code = "";
            Random rd = new Random();
            int i;
            for (i = 0; i < num; i++)
            {
                //code += source[rd.Next(0, source.Length)];
                code += str.Substring(rd.Next(0, str.Length), 1);
            }
            return code;
        }
        public bool IsReusable
        {
            get
            {
                return false;
            }
        }
    }
}

前台调用

<p>
       <!--img控件显示验证码-->
       验证码:             
       <img src="../handler/WaterMark.ashx" id="vimg" alt="" onclick="changeCode" />
       <asp:TextBox ID="txtCode" runat="server"  CssClass="textcode" Height="16px" Width="36px"></asp:TextBox>
        <!--验证控件-->
       <asp:RequiredFieldValidator ID="RequiredFieldValidator3" runat="server" ErrorMessage="请输入验证码!" Text ="*" ControlToValidate="txtCode">            
      </asp:RequiredFieldValidator>                  
</p>


点击图片进行更新,写在前台的<head>标签中

<script language="javascript" type="text/javascript">
       function chargeCode() {
       var imgNode = document.getElementById("vimg");
           imgNode.src = ".. /handler/WaterMark.ashx?t=" + (new.Date()).valueOf(); //添加时间参数为了防止解决浏览器的缓存问题
       }
</script>

点击提交判断验证码是否正确

protected void btnLogin_Click(object sender, EventArgs e)
{
       //判断验证码是否正确
       string code = txtCode.Text.Trim().ToUpper();
       string rightCode = Session["Code"].ToString();
       if (code != rightCode)
       {
           //弹出框
           Page.ClientScript.RegisterStartupScript(Page.GetType(), "message", "<script language='javascript' defer>alert('验证码输入错误!');</script>");
           return;
       }
 }

相关文章
|
前端开发 .NET 数据安全/隐私保护
菜鸟入门【ASP.NET Core】15:MVC开发:ReturnUrl实现、Model后端验证 、Model前端验证
ReturnUrl实现 我们要实现returnUrl,我们需要在注册(Register)方法中接收传进的returnUrl并给它默认值null,然后将它保存在ViewData里面 然后我们定义一个内部方法来判断跳转returnUrl //内部跳转 private IActionR...
2445 0
|
9月前
|
开发框架 JSON 算法
ASP.NET Core Web API之Token验证
ASP.NET Core Web API之Token验证
145 0
|
存储 开发框架 前端开发
ASP.NET 中验证的自定义返回和统一社会信用代码的内置验证实现
本文介绍 ASP.NET 中内置的验证功能,并介绍如何自定义验证返回信息,最后以统一社会信用代码为例,实现自定义的数据验证。
188 0
ASP.NET 中验证的自定义返回和统一社会信用代码的内置验证实现
|
开发框架 JSON 前端开发
ASP.NET MVC5----常见的数据注解和验证
ASP.NET MVC5----常见的数据注解和验证
300 0
ASP.NET MVC5----常见的数据注解和验证
|
XML 开发框架 JSON
ASP.NET Core - 实现自定义WebApi模型验证
ASP.NET Core - 实现自定义WebApi模型验证  Framework时代    在Framework时代,我们一般进行参数验证的时候,以下代码是非常常见的 复制代码 [HttpPost] public async Task<JsonResult> SaveNewCus...
1663 0
ASP.NET Core微服务之基于Ocelot+IdentityServer实现统一验证与授权
Tip: 此篇已加入.NET Core微服务基础系列文章索引 一、案例结构总览   这里,假设我们有两个客户端(一个Web网站,一个移动App),他们要使用系统,需要通过API网关(这里API网关始终作为客户端的统一入口)先向IdentityService进行Login以进行验证并获取Token,在IdentityService的验证过程中会访问数据库以验证。
2705 0
ASP.NET Core微服务之基于IdentityServer建立授权与验证服务(2)
_Tip:_ 此篇已加入.NET Core微服务基础系列文章索引 上一篇我们基于IdentityServer4建立了一个AuthorizationServer,并且继承了QuickStartUI,能够成功获取Token了。
1810 0
|
开发框架 前端开发 NoSQL
ASP.NET Core微服务之基于IdentityServer建立授权与验证服务(1)
Tip: 此篇已加入.NET Core微服务基础系列文章索引 一、IdentityServer的预备知识   要学习IdentityServer,事先得了解一下基于Token的验证体系,这是一个庞大的主题,涉及到Token,OAuth&OpenID,JWT,协议规范等等等等,园子里已经有很多介绍的文章了,个人觉得solenovex的这一篇文章《学习IdentityServer4的预备知识》言简意赅,可以快速的看看。
2073 0