前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >大型网站中的验证码解决方案

大型网站中的验证码解决方案

作者头像
liulun
发布2022-05-09 10:57:24
5090
发布2022-05-09 10:57:24
举报
文章被收录于专栏:liulun

先看这个demo的解决方案图

image
image

Entity是实体,里面有验证码的实体

代码语言:javascript
复制
        private string contentType = "image/pjpeg";
        private ImageFormat imageFormat = ImageFormat.Jpeg;
        public Bitmap Image
        {
            get;
            set;
        }
        public string ContentType
        {
            get { return contentType; }
            set { contentType = value; }
        }
        public ImageFormat ImageFormat
        {
            get { return imageFormat; }
            set { imageFormat = value; }
        }

Plugin是插件

这个验证码是插件机制实现的

接口文件为

代码语言:javascript
复制
    public interface IVerifyImage
    {
        VerifyImageInfo GenerateImage(string code, int width, int height, Color bgcolor, int textcolor);
    }

provider类是一个抽象工厂 代码为

代码语言:javascript
复制
        private static Hashtable _instance = new Hashtable();
        private static object lockHelper = new object();
        //通过接口和反射结合配置文件信息来做整站多验证码技术
        public static IVerifyImage GetInstance(string assemlyName)
        {
            if (!_instance.Contains(assemlyName))
            {
                lock (lockHelper)
                {
                    if (!_instance.ContainsKey(assemlyName))
                    {
                        IVerifyImage p = null;
                        try
                        {
                            p = (IVerifyImage)Activator.CreateInstance(Type.GetType(string.Format("Plugin.VerifyImage.{0}.VerifyImage,Plugin.VerifyImage.{0}", assemlyName), false, true));
                        }
                        catch
                        {
                            p = new Plugin.VerifyImage.JpegImage.VerifyImage();
                        }
                        _instance.Add(assemlyName, p);
                    }
                }
            }
            return (IVerifyImage)_instance[assemlyName];
        }

验证码相关对象是通过发射机制创建的

具体路径信息写在配置文件中

这样可以设置多个验证码类

具体验证码相关代码请下载这个demo自己去研究

做一个页面,重写他的onInit事件,把验证码输出出来

代码语言:javascript
复制
        protected override void OnInit(EventArgs e)
        {
            base.OnInit(e);
            string verifyAssembly = "JpegImage";//此处信息可从配置文件获得
            string bgColor = "";//Request.QueryString["bgcolor"].Trim();
            int fontColor = 1; //StrToInt(Request.QueryString["fontcolor"].Trim(), 1);
            string[] bgcolorArray = bgColor.Split(',');
            Color bg = Color.White;
            if (bgcolorArray.Length == 1 && bgColor != string.Empty)
            {
                bg = ToColor(bgColor);
            }
            else if (bgcolorArray.Length == 3 && IsNumericArray(bgcolorArray))
            {
                bg = Color.FromArgb(StrToInt(bgcolorArray[0], 255), StrToInt(bgcolorArray[1], 255), StrToInt(bgcolorArray[2], 255));
            }
            VerifyImageInfo verifyimg = Plugin.VerifyImage.VerifyImageProvider.GetInstance(verifyAssembly).GenerateImage(CreateAuthStr(5, false), 120, 60, bg, fontColor);

            Bitmap image = verifyimg.Image;

            System.Web.HttpContext.Current.Response.ContentType = verifyimg.ContentType;

            //MemoryStream ms = new MemoryStream();

            image.Save(this.Response.OutputStream, verifyimg.ImageFormat);

        }

这里涉及到很多工具方法,请下载demo自己研究

调用验证码可以在页面写JS代码

代码语言:javascript
复制
<script type="text/javascript">
   document.getElementById('vcodeimg').src='/tools/VerifyImagePage.aspx?id=4&time=' + Math.random();
</script>

源代码下载 vertify.rar

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2009-06-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
验证码
腾讯云新一代行为验证码(Captcha),基于十道安全栅栏, 为网页、App、小程序开发者打造立体、全面的人机验证。最大程度保护注册登录、活动秒杀、点赞发帖、数据保护等各大场景下业务安全的同时,提供更精细化的用户体验。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档