手机版

Asp.net web API实现图像点击图像验证码功能

时间:2021-09-04 来源:互联网 编辑:宝哥软件园 浏览:

如今,验证码的形式越来越丰富。今天我们要通过点击图片中的文字来实现验证码,如图

这个验证码验证是验证鼠标是否选择了图片中字符的位置和选择的顺序。在生成验证码时,可以提供一组底图,然后随机获取一张图片,随机选择几个单词,然后打乱字符的顺序,将其随机放置在图片的一个位置,然后记录字符的位置和顺序。

验证码图片的类别

///summary////二维码图片////summary公共类vercodepic {///summary///图片链接////summary公共字符串picurl { get设置;}///summary////首字位置////summary公共字体点font1 { get设置;}///summary///second word position////summary public font point font 2 { get;设置;}///summary////第三个字位置////summary公共字体点font3 { get设置;} ///summary ///第四个单词位置////summary公共字体点font4 { get设置;} }///summary////text position////summary public class font point { public int x { get;设置;} public int Y { get设置;}}生成验证码图片验证码的方法规定生成的验证码图片中的字体大小为20像素。因为验证码底图的大小是固定的,所以验证码底图根据字体大小分为几个网格位置。当指定一个单词在图片中的位置时,只需要随机获取其中一个网格。如果此网格中没有指定单词,请将该单词放入此网格中。

预先设置网格的方法

私有静态数组列表_ FontPointpublic static ArrayList FontPoint { get { if(_ FontPoint==null){ _ FontPoint=new ArrayList();for(int x=0;x10x){ for(int y=0;y5;y ) { _FontPoint。添加(新型号。FontPoint() { X=x * 28,Y=Y * 20 });} } } return _ FontPoint}}我选择的验证码底部图片是280*100,所以按照上面的方法把图片分成几个格,在底部设置文字位置时随机选择其中一个位置,每个字设置不同的颜色。

///摘要///根据文字和图片获取验证码图片////summary///param name=' content '/param///param name=' picFileName '/param///返回/返回公共静态VerCodePic GetVerCodePic(字符串内容,字符串picFileName,int fontSize=20) { ClassLoger .信息(“文件助手”.GetVerCodePic ','开始生成二维码');位图bmp=新位图(图片文件名);Listint hlist=new Listint();VerCodePic代码pic=new VerCodePic();int i=Utils .获取随机(0,系统集.字体点。count-1);codepic .Font1=SystemSet .FontPoint[i]作为字体点;hlist .添加;A: int i2=Utils .获取随机(0,系统集.字体点。count-1);if (hlist .包含(i2))转到a;codepic .Font2=SystemSet .FontPoint[i2]作为字体点;hlist .加(I2);B: int i3=Utils .获取随机(0,系统集.字体点。count-1);if (hlist .包含(i3))转到b;hlist .add(i3);codepic .Font3=SystemSet .FontPoint[i3]作为字体点;C: int i4=Utils .获取随机(0,系统集.字体点。count-1);if (hlist .包含(i4))转到c;hlist .add(i4);codepic .Font4=SystemSet .FontPoint[i4]作为字体点;字符串fileName=(内容'-' picFileName '-' I ' | ' I2 ' | ' i3 ' | ' i4)。MD5()路径. GetExtension(picFileName);字符串目录=路径。联合收割机(系统集。资源路径,系统集. VerCodePicPath);字符串文件路径=路径。组合(目录,文件名);如果(文件。存在(文件路径)){ codepic .PicURL=字符串。格式(' {0}/{1}/{2} ',系统集。网络资源网站,系统集. VerCodePicPath,FIlename);返回codepic} if(!目录。存在(目录)){目录创建目录(目录);}图形g=图形.来自IMage(BMP);字体=新字体('微软雅黑、字体大小、图形单位。像素);SolidBrush=新的实心刷子(颜色。黑色);SolidBrush 1=新的实心刷子(颜色。秘鲁);SolidBrush 2=新的实心刷子(颜色。黄色绿色);SolidBrush 3=新的实心刷子(颜色.天蓝色);Listchar fontlist=content .to list();分类员.信息(“文件助手”.GetVerCodePic ',fontlist .数数。ToString());绘图(字体列表[0]).TryToString(),字体,brush,new PointF(codepic .Font1。十、抄本.字体1。y));g。拉绳(字体列表[1]。TryToString(),字体,sbrush1,new PointF(codepic .Font2。十、抄本.字体2。y));g。拉绳(字体列表[2]。TryToString(),字体,sbrush2,new PointF(codepic .Font3。十、抄本.字体3。y));拉绳(字体列表[3])。TryToString(),字体,sbrush3,new PointF(codepic .Font4。十、抄本.字体4。y));bmp .保存(文件路径,图像格式. JPEG);codepic .PicURL=字符串。格式(' {0}/{1}/{2} ',系统集。网络资源网站,系统集. VerCodePicPath,FIlename);返回codepic}获取图片验证码的美国石油学会(美国石油协会)接口,在这个接口中从成语库中随机选取了一个成语,然后随机选取了一个图片,然后调用生成图片验证码的方法,生成了图片验证码,并且把验证码对应的信息缓存在redis中,设定缓存时间,将redis的键作为一个临时令牌随同验证码返回

///摘要///获取验证码,有效时间10分钟////summary///returns/returns[HttpGet][Route(' vercode ')]public JsonResultVerCodePicViewModel VerCodePic(){ JsonResultVerCodePicViewModel结果=new JsonResultVerCodePicViewModel();结果。代码=1;结果。消息='确定;请尝试{ ClassLoger .信息(' VerCodePic ','开始获取成语');cy _ dict bll cyb ll=new cy _ dict bll();IListcy_dict cylist=cybll .GetAllcy _ dict();分类员.信息(' VerCodePic ',循环列表.数数。ToString());int i=Utils .GetRandom(0,循环列表.计数-1);分类员.Info('VerCodePic ',I . ToString());cy _ dict cy=cylist[I];分类员.信息(' VerCodePic成语:',cy。陈余);VerCodePicViewModel vcvm=new VerCodePicViewModel();字符串sourcePic=FileHelper .GetVerCodePicResource();if (sourcePic .IsNull() ||!文件存在(源pic)){源pic=@ ' e : \ web resources \ images \ VerCodePicSource \ 1。jpg ';} ClassLoger .信息(' VerCodePic图片,SourcePic);VerCodePic codepic=FileHelper .GetVerCodePic(cy。陈余,图片来源);vcvm。内容=cy。程煜;vcvm .MainPic=codepic .PicURL结果。结果=vcvmstring key=CookieKey();RedisBase .项目集(键,code pic);RedisBase .ExpireEntryAt(键,日期时间。现在。增加分钟(10分钟);结果结果消息=关键字} catch(异常ex) { ClassLoger .错误(' AccountController .VerCodePic ',ex);结果。代码=-1;result.msg='AccountController .VerCodePic发生异常:' ex .消息;}返回结果;}效果如图:

图片验证码校验接口参数结构

公共类CheckPicCodeViewModel {///summary///客户端令牌////摘要公共字符串标记{获取设置;}公共双x1 { get设置;}公共双x2 { get设置;}公共double x3 { get设置;}公共双x4 { get设置;}公共双y1 { get设置;}公共双y2 { get设置;}公共双y3 { get设置;}公共双y4 { get设置;} }验证码校验接口

///摘要///校验图片验证码是否正确////summary///param name=' piccode '/param///returns/returns[Http set][Route(' CheckPiccode ')]public async taskihtpactionresult CheckPiccode([FromBody]CheckPiccode viewmodel piccode){ JSonResultBool result=new JSonResultBool();结果。代码=1;结果。消息='确定;if (piccode==null) { result .结果=假;结果。结果消息='参数错误;返回Ok(结果);}如果(字符串IsNullOrEmpty(piccode.token) ||!RedisBase .包含KeY(pic代码。令牌){结果.结果=假;结果。结果消息='验证码已过期;返回Ok(结果);}结果。结果=等待任务Runbool(()={ bool标志=false VerCodePic code pic=redIsbase .item _ GetVerCodePic(piccode。令牌);如果(数学Abs(代码.Font1。X - piccode.x1) 0.5 ||数学Abs(代码.Font1。Y - piccode.y1) 0.5 ||数学Abs(代码.Font2。X - piccode.x2) 0.5 ||数学Abs(代码.Font2。Y - piccode.y2) 0.5 ||数学Abs(代码.Font3。X - piccode.x3) 0.5 ||数学Abs(代码.Font3。Y - piccode.y3) 0.5 ||数学Abs(代码.Font4。X - piccode.x4) 0.5 ||数学Abs(代码.字体4。Y-pic代码。y4)0.5){ flag=false;结果。结果消息='验证码错误;} else { flag=true结果。结果消息='验证码正确;}返回标志;});返回Ok(结果);}传入用户选中的位置和顺序,并对其进行验证。

以上所述是小编给大家介绍的Asp.net网络应用编程接口实现图片点击式图片验证码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!

版权声明:Asp.net web API实现图像点击图像验证码功能是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。