首页 > 其他分享 >验证码插件 vercode.js

验证码插件 vercode.js

时间:2023-07-22 12:23:01浏览次数:36  
标签:插件 code int vercode 验证码 js Color new

第1代图片验证码 - 字母数字型

 

第2代滑动验证码 - 图片截取型

第3代验证码 - 选图型

 vercode.js 结合了上面的情况下新研发的一种验证码。

验证码类型 验证码描述 操作性 安全性 描述
字母数字型图片验证码

这是一种通过后台随机码生成图片的验证码。服务器会在随机码生成时保存随机码。

当进行登录验证时,会根据输入的验证码与服务器保存的验证码进行匹配。

★★★ ★★★★

需要输入

客户端与服务端联合验证,安全性高

滑动验证码

这是一种客户端验证的验证码,相对来说安全性不高,因为随机码是客户端生成的,

验证也是客户端完成的,客户端完成之后再执行的服务器账号密码验证,对于存在

攻击性的情况下来说,获取到服务器验证接口后,是完全可以跳过客户端验证直接

访问服务端接口进行账号和密码验证的。

★★★★★ ★★★

只需要滑动

仅客户端验证,安全性低

选图型验证码

这是一种通过服务端图片与字符匹配的关系生成的一种拼图提供给客户端,客户端

点击拼图后,会保存拼图背后的字符,从而拿客户端的字符与服务端图片对应字符

进行匹配

★★★ ★★★★★

需要人眼识别和选择

客户端与服务端联合验证,安全性高

vercode验证码

这种是结合了第一种验证码,它也是通过服务端生成随机字符,并保留随机字符,

然后生成字符图片给客户端,客户端生成键盘,用户通过选择键盘字符。然后在登

录时将账号密码以及选择的字符一并提供给服务端验证。

★★★★ ★★★★

直接选择

客户端与服务端联合验证,安全性高

 

 

 

 

 

 

 

 

 

 

 

 

 

 

vercode.js

var vercode = new Object();
vercode.apiPath = "";
vercode.userId = "";
vercode.generateVerifyImage = function () {
    try {
        var url = vercode.apiPath;
        var userId = $(vercode.userId).val();
        $.ajax({
            url: url,
            type: 'post',
            data: { userId: userId },
            dataType: 'json',
            async: false,
            success: function (res) {
                if (res.code == 0) {
                    document.getElementById('verImage').src = "data:image/jepg;base64," + res.data;
                }
            },
            error: function () {
                console.log('Error occurred while opening the image file.');
            }
        });
    } catch (e) {

    } finally {
        document.getElementById('verset').style.display = 'block';
        document.getElementById('verset').style.top = ($('#vercode').offset().top + $('#vercode').height())+"px";
        document.getElementById('verset').style.left = ($('#vercode').offset().left)+"px";
        document.getElementById('code').innerText = '';
    }
}
vercode.appendVer = function (v) {
    var codeLength = 4;//   验证码长度
    if (document.getElementById('code').innerText.length == codeLength) {
        document.getElementById('verset').style.display = 'none';
        return;
    }
    document.getElementById('code').innerText += v.innerText;
};
vercode.Init = function (apiPath, userId) {
    let arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
    //arr.sort(() => Math.random() - 0.5);    //  如果希望键盘顺序显示,注释改行
    arr.splice(9, 0, 99);
    arr.push(99);

    var template = "";
    for (var i = 0; i < 12; i++) {
        if (i == 9 ) {
            template += '<li onclick="vercode.generateVerifyImage()">重置</li>';
        }
        else if (i == 11) {
            template += '<li onclick="document.getElementById(\'verset\').style.display = \'none\'">确认</li>';
        }
        else {
            template += '<li onclick="vercode.appendVer(this)">' + arr[i] + '</li>';
        }
    }
    $(".verset ul").html(template);
    $("#verImage").click(function () {
        vercode.generateVerifyImage();
    })
    $("#verImage").attr("title", "点击后刷新验证码");
    vercode.apiPath = apiPath;
    vercode.userId = userId;
};

 

vercode.css

.vercode {
    width: 330px;
    margin:10px 0px;
}

    .vercode .code {
        display: inline-block;
        width: 45%;
        margin-right: 5px;
        font-family: 'Arial Unicode MS';
        font: 20px/38px bold;
        line-height: 38px;
        height: 38px;
        text-align: center;
        float: left;
        border-radius: 5px;
        background-color: #f8f4f4;
        text-shadow: 2px 2px 2px #52c574;
    }

            .vercode .verimg {
                display: inline-block;
                width: 45%;
                margin-left: 5px;
                line-height: 38px;
                height: 38px;
                text-align: center;
                cursor: pointer;
            }

                .vercode .verimg img {
                    display: inline-block;
                    width: 100%;
                    height: 38px;
                    vertical-align: middle;
                    line-height: 38px;
                    text-align: center;
                    cursor: pointer;
                }

.verset {
    width: 330px;
    padding: 0px;
    text-align: left;
    height: 100px;
    display: none;
    margin: 10px;
    height: 120px;
    position: fixed;
    top: 0px;
    left: 0px;
    z-index: 9999;
}

        .verset ul {
            width: 76%;
            height: 126px;
            line-height: 28px;
            margin: 0px;
            clear: both;
            padding: 5px 0px;
            padding-left: 5px;
        }

            .verset ul li {
                float: left;
                list-style: none;
                width: 31%;
                background-color: #fff; /*  修改按钮背景色   */
                text-align: center;
                border: 1px solid #666;
                color: #666; /*  修改按钮字体色   */
                border-radius: 5px;
                cursor: pointer;
                margin:1px;
            }

  login.html 登录示例

<li>
                    <em></em>
                    <input type="text" id="userId" tabindex="1" placeholder="请输入用户名" class="longcode" />
                    <label id="imgUid" class="error_msg"></label>
                </li>
                <li>
                    <em class="code"></em>
                    <input type="password" id="pwd" placeholder="请输入密码" class="longcode on" tabindex="2" />
                    <label id="imgPwd" class="error_msg"></label>
                </li>


                <li>
                    <div class="vercode" id="vercode">
                        <div class="code" id="code"></div>
                        <div class="verimg">
                            <img src="" id="verImage" />
                        </div>
                    </div>

                </li>
...

 <div class="verset" id="verset">
            <ul></ul>
        </div>

  login.html 登录访问服务器javascript方法

<script>
        function syslogin() {
            $.post('/Login/Verify', { userId: $("#userId").val(), pwd: $("#pwd").val(), clientCode: $("#code").text() }, function (res) {
                if (res.code != 0) {
                    document.getElementById('lblMessage').innerText = res.msg;
                    document.getElementById('lblMessage').style.color = "red";
                }
                else {
                    document.getElementById('lblMessage').innerText = res.msg;
                    document.getElementById('lblMessage').style.color = "green";
                    //setTimeout(function () {
                    //    location.href = '/Basic/IcsonFrame_DBC_Table.aspx';
                    //},1000)
                }
            });
        }
       
    </script>

  login.html 初始化javascript方法

vercode.Init方法第一个参数是请求服务端验证码图片的接口地址,第二个参数是登录该账号的用户名元素
<script>
        $(function () {
            vercode.Init('/Login/GenerateVerifyImage', "#userId");
        })
    </script>

  服务端验证代码C#

public class LoginController : Controller
    {
        private VryImgGen vryImgGen = new VryImgGen();
        // GET: Home
        public ActionResult Index()
        {
            return View();
        }
        [HttpPost]
        public ActionResult Verify(string userId,string pwd,string clientCode)
        {
            if(clientCode != Session[userId].TryString(""))
            {
                return Json(new { code = -1, msg = "验证码错误!" });
            }

            return Json(new { code = 0, msg = "验证成功" });
        }
        [HttpPost]
        public ActionResult GenerateVerifyImage(string userId)
        {
            var verifyCode = new Random().Next(1000, 9999).ToString();
            var bmp = vryImgGen.CreateImageCode(verifyCode);
            Session[userId] = verifyCode;

            MemoryStream ms = new MemoryStream();
            bmp.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
            byte[] arr = new byte[ms.Length];
            ms.Position = 0;
            ms.Read(arr, 0, (int)ms.Length);
            ms.Close();
            return Json(new { code = 0, data = Convert.ToBase64String(arr),msg="获取验证码成功" });
        }
    }

  生成验证码图片的代码C#

using System;
using System.Collections.Generic;
using System.Web;
using System.Drawing;
...

/// <summary>
    /// 图片验证码
    /// </summary>
    public class VryImgGen
    {
        #region 生成校验码图片
        /// <summary>
        /// 生成校验码图片
        /// 校验码保存在Session["ImgGen"]中
        /// </summary>
        /// <returns>Bitmap</returns>
        public Bitmap CreateImageCode()
        {
            string code = CreateVerifyCode(Length);
            HttpContext.Current.Session["ImgGen"] = code.ToUpper();
            int fSize = FontSize;
            int fWidth = fSize + Padding;
            int imageWidth = (int)(code.Length * fWidth) + 4 + Padding * 2;
            int imageHeight = fSize * 2 + Padding;

            System.Drawing.Bitmap image = new System.Drawing.Bitmap(imageWidth, imageHeight);
            Graphics g = Graphics.FromImage(image);
            g.Clear(BackgroundColor);
            Random rand = new Random();

            //给背景添加随机生成的燥点
            if (this.Chaos)
            {
                Pen pen = new Pen(ChaosColor, 0);
                int c = Length * 100;

                for (int i = 0; i < c; i++)
                {
                    int x = rand.Next(image.Width);
                    int y = rand.Next(image.Height);

                    g.DrawRectangle(pen, x, y, 1, 1);
                }
            }

            int left = 0, top = 0, top1 = 1, top2 = 1;

            int n1 = (imageHeight - FontSize - Padding * 2);
            int n2 = n1 / 4;
            top1 = n2;
            top2 = n2 * 2;

            Font f;
            Brush b;
            int cindex, findex;

            //随机字体和颜色的验证码字符
            for (int i = 0; i < code.Length; i++)
            {
                cindex = rand.Next(Colors.Length - 1);
                findex = rand.Next(Fonts.Length - 1);

                f = new System.Drawing.Font(Fonts[findex], fSize, System.Drawing.FontStyle.Bold);
                b = new System.Drawing.SolidBrush(Colors[cindex]);

                if (i % 2 == 1)
                {
                    top = top2;
                }
                else
                {
                    top = top1;
                }

                left = i * fWidth;

                g.DrawString(code.Substring(i, 1), f, b, left, top);
            }

            //画一个边框 边框颜色为Color.Gainsboro
            g.DrawRectangle(new Pen(Color.Gainsboro, 0), 0, 0, image.Width - 1, image.Height - 1);
            g.Dispose();

            //产生波形
            image = TwistImage(image, false, 0, 0);

            return image;
        }

        public Bitmap CreateImageCode(string code)
        {
            int fSize = FontSize;
            int fWidth = fSize + Padding;

            int imageWidth = (int)(code.Length * fWidth) + 4 + Padding * 2;
            int imageHeight = fSize * 2 + Padding;

            System.Drawing.Bitmap image = new System.Drawing.Bitmap(imageWidth, imageHeight);

            Graphics g = Graphics.FromImage(image);

            g.Clear(BackgroundColor);

            Random rand = new Random();

            //给背景添加随机生成的燥点  
            if (this.Chaos)
            {

                Pen pen = new Pen(ChaosColor, 0);
                int c = Length * 10;

                for (int i = 0; i < c; i++)
                {
                    int x = rand.Next(image.Width);
                    int y = rand.Next(image.Height);

                    g.DrawRectangle(pen, x, y, 1, 1);
                }
            }

            int left = 0, top = 0, top1 = 1, top2 = 1;

            int n1 = (imageHeight - FontSize - Padding * 2);
            int n2 = n1 / 4;
            top1 = n2;
            top2 = n2 * 2;

            Font f;
            Brush b;

            int cindex, findex;

            //随机字体和颜色的验证码字符  
            for (int i = 0; i < code.Length; i++)
            {
                cindex = rand.Next(Colors.Length - 1);
                findex = rand.Next(Fonts.Length - 1);

                f = new System.Drawing.Font(Fonts[findex], fSize, System.Drawing.FontStyle.Bold);
                b = new System.Drawing.SolidBrush(Colors[cindex]);

                if (i % 2 == 1)
                {
                    top = top2;
                }
                else
                {
                    top = top1;
                }

                left = i * fWidth;

                g.DrawString(code.Substring(i, 1), f, b, left, top);
            }

            //画一个边框 边框颜色为Color.Gainsboro  
            g.DrawRectangle(new Pen(Color.Gainsboro, 0), 0, 0, image.Width - 1, image.Height - 1);
            g.Dispose();

            //产生波形(Add By 51aspx.com)  
            image = TwistImage(image, true, 3, 2);

            return image;
        }

        #endregion

        #region 属性

        #region 验证码长度
        int length = 4;
        public int Length
        {
            get { return length; }
            set { length = value; }
        }
        #endregion

        #region 验证码字体大小(为了显示扭曲效果,默认40像素,可以自行修改)
        int fontSize = 26;
        public int FontSize
        {
            get { return fontSize; }
            set { fontSize = value; }
        }
        #endregion

        #region 边框补(默认1像素)
        int padding = 2;
        public int Padding
        {
            get { return padding; }
            set { padding = value; }
        }
        #endregion

        #region 是否输出燥点(默认不输出)
        bool chaos = true;
        public bool Chaos
        {
            get { return chaos; }
            set { chaos = value; }
        }
        #endregion

        #region 输出燥点的颜色(默认灰色)
        Color chaosColor = Color.LightGray;
        public Color ChaosColor
        {
            get { return chaosColor; }
            set { chaosColor = value; }
        }
        #endregion

        #region 自定义背景色(默认白色)
        Color backgroundColor = Color.White;
        public Color BackgroundColor
        {
            get { return backgroundColor; }
            set { backgroundColor = value; }
        }
        #endregion

        #region 自定义随机颜色数组
        Color[] colors = { Color.Black, Color.Black, Color.Black, Color.Black, Color.Black, Color.Black, Color.Black, Color.Black };
        public Color[] Colors
        {
            get { return colors; }
            set { colors = value; }
        }
        #endregion

        #region 自定义字体数组
        string[] fonts = { "华文中宋", "华文中宋" };
        public string[] Fonts
        {
            get { return fonts; }
            set { fonts = value; }
        }
        #endregion

        #region 自定义随机码字符串序列(使用逗号分隔)
        string codeSerial = "2,3,4,5,6,7,8,9,a,b,c,d,e,f,g,h,j,k,m,n,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,J,K,L,M,N,P,Q,R,S,T,U,V,W,X,Y,Z";
        public string CodeSerial
        {
            get { return codeSerial; }
            set { codeSerial = value; }
        }
        #endregion
        #endregion

        #region 产生波形滤镜效果

        private const double PI = 3.1415926535897932384626433832795;
        private const double PI2 = 6.283185307179586476925286766559;

        /// <summary>
        /// 正弦曲线Wave扭曲图片(Edit By 51aspx.com)
        /// </summary>
        /// <param name="srcBmp">图片路径</param>
        /// <param name="bXDir">如果扭曲则选择为True</param>
        /// <param name="nMultValue">波形的幅度倍数,越大扭曲的程度越高,一般为3</param>
        /// <param name="dPhase">波形的起始相位,取值区间[0-2*PI)</param>
        /// <returns></returns>
        public System.Drawing.Bitmap TwistImage(Bitmap srcBmp, bool bXDir, double dMultValue, double dPhase)
        {
            System.Drawing.Bitmap destBmp = new Bitmap(srcBmp.Width, srcBmp.Height);

            // 将位图背景填充为白色
            System.Drawing.Graphics graph = System.Drawing.Graphics.FromImage(destBmp);
            graph.FillRectangle(new SolidBrush(System.Drawing.Color.White), 0, 0, destBmp.Width, destBmp.Height);
            graph.Dispose();

            double dBaseAxisLen = bXDir ? (double)destBmp.Height : (double)destBmp.Width;

            for (int i = 0; i < destBmp.Width; i++)
            {
                for (int j = 0; j < destBmp.Height; j++)
                {
                    double dx = 0;
                    dx = bXDir ? (PI2 * (double)j) / dBaseAxisLen : (PI2 * (double)i) / dBaseAxisLen;
                    dx += dPhase;
                    double dy = Math.Sin(dx);

                    // 取得当前点的颜色
                    int nOldX = 0, nOldY = 0;
                    nOldX = bXDir ? i + (int)(dy * dMultValue) : i;
                    nOldY = bXDir ? j : j + (int)(dy * dMultValue);

                    System.Drawing.Color color = srcBmp.GetPixel(i, j);
                    if (nOldX >= 0 && nOldX < destBmp.Width
                     && nOldY >= 0 && nOldY < destBmp.Height)
                    {
                        destBmp.SetPixel(nOldX, nOldY, color);
                    }
                }
            }

            return destBmp;
        }



        #endregion

        #region 生成随机字符码
        public string CreateVerifyCode(int codeLen)
        {
            if (codeLen == 0)
            {
                codeLen = Length;
            }

            string[] arr = CodeSerial.Split(',');

            string code = "";

            int randValue = -1;

            Random rand = new Random(unchecked((int)DateTime.Now.Ticks));

            for (int i = 0; i < codeLen; i++)
            {
                randValue = rand.Next(0, arr.Length - 1);

                code += arr[randValue];
            }

            return code;
        }
        public string CreateVerifyCode()
        {
            return CreateVerifyCode(0);
        }
        #endregion
    }

  

  

 

标签:插件,code,int,vercode,验证码,js,Color,new
From: https://www.cnblogs.com/licin/p/17573137.html

相关文章

  • 谷歌Chrome浏览器安装插件Hackerbar
    谷歌Chrome浏览器安装插件Hackerbar因为google浏览器的应用市场(https://chrome.google.com/webstore/category/extensions)在国内无法访问,所以无法在线安装插件,这里提供开发者模式离线安装插件的方法一、下载hackbarcrx脚本谷歌浏览器的插件离线文件的扩展名为:crx(Firefox火狐浏览器......
  • java 将json 转成对象数组
    将JSON转换为对象数组的步骤作为一名经验丰富的开发者,我将为你介绍如何将JSON数据转换为对象数组。这是一个非常常见的操作,而且在Java中也非常简单。下面是整个过程的步骤概览:步骤动作1.导入JSON库在你的项目中导入JSON库,以便能够处理JSON数据。2.创......
  • js 计算两个字符串日期相差多少天
    你可以使用JavaScript的Date对象来计算两个字符串日期之间的天数差异。首先,将两个字符串转换为Date对象,然后计算它们之间的毫秒差值,最后将毫秒差值转换为天数。以下是一个示例代码:functiongetDaysDifference(dateString1,dateString2){vardate1=newDate(dateString1......
  • jsr303
    JavaBean的校验注解在实际开发中非常常见,它们可以确保数据的有效性和准确性,增强系统的健壮性和安全性。以下是一些常用的JavaBean校验注解及其含义:1.@NotNull:用于检查字段是否为null。2.@NotBlank:用于检查字符串字段是否为空或包含空格。3.@NotEmpty:用于检查字符串、......
  • 通过JS设置CSS样式
    读取元素样式在JS中可以使用getComputedStyle()读取元素样式官网摘要Window.getComputedStyle()方法返回一个对象,该对象在应用活动样式表并解析这些值可能包含的任何基本计算后报告元素的所有CSS属性的值。私有的CSS属性值可以通过对象提供的API或通过简单地使用CSS......
  • js语法
     const[lon,lat]=coord.split(',').map(Number); 原理解释使用了解构赋值和数组映射的方式从坐标字符串(coord)中提取经度(lon)和纬度(lat)值,并将它们从字符串转换为数字。 1、coord.split(','):使用逗号,作为分隔符,将坐标字符串coord拆分为一个字符串数组。例如,如果......
  • vue 使用vue-json-viewer 展示 JSON 格式数据
    为什么需要Vue-json-viewer在前端开发中,我们经常需要处理JSON数据。然而,JSON数据一般是以字符串的形式来传递,难以直观地查看、理解和调试,这阻碍了我们开发工作的进程。Vue-json-viewer组件正是为了解决这个问题而生。安装vue-json-viewer插件npminstallvue-json-viewer--sa......
  • struts2 jsonplugin includeProperties中对list集合的正则配置
     1、listAttachment.*\.realName 和listAttachment.* 效果一样,元素中所有的属性都json化了   "listAttachment":[{"encodedRealName":"%E8%AE%A1%E5%88%92%E4%BB%BB%E5%8A%A1%E4%B9%A6%E5%88%97%E8%A1%A820111223102409.xls","id":"408080b7......
  • (转)JS判断文件大小
    第一种是应用ActiveX控件的实现,例如:Javascript代码<scripttype="text/javascript">functiongetFileSize(filePath){varfso=newActiveXObject("Scripting.FileSystemObject");alert("文件大小为:"+fso.GetFile(filePath).s......
  • 【随手记录】MAT软件及IBM扩展插件IDFT下载
    MAT独立工具最新版本下载地址:https://projects.eclipse.org/projects/tools.matBIMIDFT扩展插件地址:https://www.ibm.com/support/pages/eclipse-memory-analyzer-tool-dtfj-and-ibm-extensions最新版需要jdk17以上,OpenJDK下载地址:https://jdk.java.net/archive/......