mvc验证码
基于Struts框架的验证码的实现
基于Struts框架的验证码的实现【摘要】随着网络的普及,网络的安全性愈来愈重要,因此验证码应运而生,验证码是现在很多网站通行的方式,它的目的是为了防止客户机恶意攻击造成的系统资源浪费,网站性能降低甚至程序崩溃。
本文分析了struts的框架、技术以及流程,并结合实际讨论了基于struts框架的验证码实现,有一定实际应用意义。
【关键词】验证码;Struts;网络安全0 引言随着计算机技术、网络技术的发展,网络安全逐渐得到了人们的重视,对于网站的营运者来说网络安全显得尤为重要。
因为一旦受到外来的恶意攻击,网站就显得不那么安全、稳定了。
为了防止恶意访问,验证码应运而生,它的诞生是为了防止客户机恶意攻击造成的系统资源浪费,网站性能降低甚至程序崩溃。
验证码(CAPTCHA)是“Completely Automated Public Turing test to tell Computers and Humans Apart”(全自动区分计算机和人类的图灵测试)的缩写,是将一串随机产生的数字或符号,生成一幅图片,图片里加上一些干扰象素(防止OCR),由用户肉眼识别其中的验证码信息,输入表单提交网站验证,验证成功后才能使用某项功能。
验证码一般是防止有人利用机器人自动批量注册、对特定的注册用户用特定程序暴力破解方式进行不断的登陆、灌水。
因为验证码是一个混合了数字或符号的图片,人眼看起来都费劲,机器识别起来就更困难。
所以现在很多网站都采用了验证码技术。
1 Struts工作流程Struts的工作流程简介如图1所示:图1 Struts工作流程1.1 浏览器发送请求,例如请求/mypage.action、/reports/myreport.pdf等。
1.2 Control中的核心控制器FilterDispatcher根据请求调用相应的业务逻辑控制器(Action)。
1.3 Struts的拦截器链自动对请求应用通用功能,如数据校验和文件上传等功能。
验证码设置方法
网页验证码实现步骤及细节业务部门提出要做一个客户自助查询的系统,而且这个系统是要公布到互联网上的。
这样的话,除了一般常见的防注入、服务器安全外,最简单的就是在用户登录处加一个验证码,可以在一定程度上加大恶意尝试破解用户密码的难度。
在网上搜索了一天的类似内容,做成了一个自己的小程序,与大家共同分享,并将使用过程中的小细节说一下,一则备忘,二则也许能让后来的朋友多了解到一点东西吧。
效果图:老样子,先上代码。
个人的习惯,对于做为系统的纯输出功能的代码,使用ashx文件(一般处理程序)而不是aspx文件,呵呵。
先建立一个verify_code.ashx文件,代码如下:<%@ WebHandler Language="VB"Class="verify_code" %>Imports SystemImports System.DrawingImports System.Drawing.Drawing2DImports System.Drawing.ImagingImports System.Drawing.TextImports System.WebImports System.Web.SessionStateImports System.Web.ConfigurationPublic Class verify_code : Implements IHttpHandler, IRequiresSessionStatePublic Sub ProcessRequest(ByVal context As HttpContext) Implements IHttpHandler.ProcessRequest'定义图片大小Dim bitMapImage As New Bitmap(80, 24)Dim verity_code As String'生成图片DisturbBitmap(bitMapImage)Dim graphicImage As Graphics = Graphics.FromImage(bitMapImage)graphicImage.SmoothingMode = SmoothingMode.HighSpeed'指定字体、大小、风格Dim fontfamily As New FontFamily("Consolas")Dim font As New Font(fontfamily, 20, FontStyle.Regular, GraphicsUnit.Pixel)'生成六位随机字符,使用GetRandomint为生成一个六位随机数字verity_code = GetRanChar(6)'将随机字符写到图片中graphicImage.DrawString(verity_code, font, Brushes.Green, New Point(1, 1))'在外围画一个边框graphicImage.DrawRectangle(New Pen(Color.Green, 0), 0, 0, bitMapImage.Width - 1, bitMapImage.Height - 1)'输出格式为JPG文件context.Response.ContentType = "image/jpeg"'将生成的验证码写到Session中,供程序判断context.Session("verify_code") = verity_code'输出验证码图片bitMapImage.Save(context.Response.OutputStream, ImageFormat.Jpeg)graphicImage.Dispose()bitMapImage.Dispose()End SubPublic Function GetRandomint() As StringDim random As New Random()Return (random.[Next](100000, 999999).ToString()) End FunctionPublic Function GetRanChar(Optional ByVal vinum As Integer = 6) As StringDim Vchar As StringDim Vnum As String = ""If vinum = 0Thenvinum = 6End If'字符串中没有使用0和O,以及小写的L,以免在验证码上看不清楚 Vchar ="2,A,B,C,D,1,E,F,G,H,I,4,J,K,L,M,N,6,P,Q,R,S,T,8,U,W,X,Y,7,Z,a,b,c,d, e,5,f,g,h,i,j,k,m,n,p,3,q,r,s,t,9,u,v,w,x,y,z"Dim VcArray() As String = Vchar.Split(",")Dim random As New Random()Dim i As IntegerDim iNum As IntegerFor i = 1To vinumiNum = VcArray.LengthWhile iNum = VcArray.LengthiNum = Convert.ToInt32((VcArray.Length) *random.NextDouble())End WhileVnum = Vnum + VcArray(iNum)NextReturn VnumEnd FunctionPrivate Sub DisturbBitmap(ByVal map As Bitmap)Dim random As New Random()'通过随机数生成Dim k As Integer = 0While k < 80Dim j As Integer = 0While j < 24'在8%的随机位置产生噪点,100就是无噪点,一般不要小于85If random.Next(0, 100) <= 92Thenmap.SetPixel(k, j, Color.AliceBlue)End IfSystem.Math.Max(System.Threading.Interlocked.Increment(j), j - 1) End WhileSystem.Math.Max(System.Threading.Interlocked.Increment(k), k - 1)End WhileEnd SubPublic ReadOnly Property IsReusable() As Boolean Implements IHttpHandler.IsReusableGetReturn FalseEnd GetEnd PropertyEnd Class使用以下方式就可以在页面指定的地方显示验证码:<img id="Verify_code" src="Verify_Code.ashx" width="80" height="24"/>代码应该都不复杂,大家可以看明白,如果不明白,复制过去也能使用,就不再多说了,因为这方面的资料也很多,下面就我在编写过程中发现的一些小细节与大家共同讨论一下:一、验证码的刷新:如果生成的验证码实在看不清楚,用户就需要刷新一个验证码,很多网站都提供了点击验证码后自动刷新,查看了一下代码,有些是使用了jquery的ajax功能,但我感觉有些复杂,后来用下面这种方法处理了,效果也极好。
验证码实现原理
验证码实现原理验证码(CAPTCHA)是一种用于区分人类用户和计算机程序的技术,它通常通过要求用户在网页上输入难以被计算机识别的字符或图像来验证用户的身份。
验证码的实现原理涉及到计算机视觉、人工智能和信息安全等多个领域,下面我们将从几个方面来介绍验证码的实现原理。
首先,验证码的实现原理基于计算机视觉技术。
在验证码中,常见的形式包括图像验证码和语音验证码。
图像验证码通常是由一些扭曲的字符组成,而语音验证码则是由一段随机生成的语音内容组成。
这些验证码需要用户进行识别,而计算机视觉技术则可以帮助计算机理解和识别这些验证码。
计算机视觉技术可以通过图像处理、特征提取和模式识别等方法,对验证码进行分析和识别,从而判断用户输入的是否是正确的验证码。
其次,验证码的实现原理还涉及到人工智能技术。
随着深度学习和神经网络技术的发展,人工智能在验证码识别中扮演着越来越重要的角色。
利用深度学习算法,计算机可以通过大量的训练数据学习验证码的特征和规律,从而提高验证码识别的准确性和鲁棒性。
人工智能技术的应用使得验证码的安全性得到了进一步的提升,也为用户提供了更便捷的验证体验。
此外,验证码的实现原理还与信息安全密切相关。
验证码的设计旨在防止恶意程序和机器人对网站进行恶意攻击和非法访问。
通过要求用户输入验证码,网站可以有效地区分人类用户和计算机程序,从而提高网站的安全性和可靠性。
验证码的实现原理需要考虑到信息安全的需求,确保验证码的生成和识别过程不受到恶意攻击和破解。
总的来说,验证码的实现原理涉及到计算机视觉、人工智能和信息安全等多个领域。
通过计算机视觉技术对验证码进行识别,利用人工智能技术提高验证码识别的准确性,同时结合信息安全技术确保验证码的安全性,可以有效地防止恶意程序和机器人对网站进行攻击和非法访问。
验证码技术的不断创新和发展,将为用户提供更安全、便捷的网络使用体验。
验证码实现原理
验证码实现原理
验证码实现的原理是基于人机识别的思想,通过给用户展示一些特定的图像或文本,要求用户根据这些信息做出相应的回答或操作,以验证用户的身份。
具体实现的原理包括以下几个步骤:
1. 生成验证码:系统根据预设的规则和参数,通过随机生成一组图像、文字或数字等信息作为验证码的内容。
这些信息可能包括字母、数字、形状、色彩等元素,并通过绘制、渲染等方式生成最终的验证码图片。
2. 展示验证码:将生成的验证码图片展示给用户,一般会将验证码图片显示在网页或应用的相应位置上,通常配合提示文字或说明,告知用户需要根据验证码图像进行相应的操作。
3. 用户响应:用户根据验证码图片展示的内容,按照要求回答或操作相应的需求。
例如,用户可能需要在输入框中输入验证码中显示的字母、数字等,或者根据图像中的要求选择符合条件的选项。
4. 校验验证码:用户通过完成相应的回答或操作后,系统会将用户的响应信息与生成的验证码进行比对校验。
校验方法通常采用图像识别算法或直接比对用户输入的文本与验证码图像生成的文本是否一致。
5. 验证结果:校验完成后,系统会判断用户的验证码回答或操
作是否正确,并根据结果进行相应的处理。
如验证成功,则表示用户的身份验证通过,可以继续进行后续操作;若验证失败,则可能要求用户重新输入验证码或进行其他验证方式。
通过以上步骤,验证码能够起到一定的安全验证作用,防止机器或恶意攻击等非法行为的发生,保护用户的信息安全。
验证码大全 (2)
验证码大全什么是验证码验证码(CAPTCHA)是Completely Automated Public Turing test to tell Computers and Humans Apart的缩写,意为完全自动区分计算机和人类的图灵测试。
它是一种用于验证用户是否为真实人类而不是机器的方法。
验证码是由一系列随机生成的字符、数字或图形组成,用户需要识别并输入正确的组合才能通过验证。
通过使用验证码,网站可以防止恶意软件、机器人和其他自动化工具进行恶意活动,提高网站的安全性和用户体验。
常见的验证码类型1. 文本验证码文本验证码是最基本和常见的验证码类型之一。
它由一串随机生成的字符组成,用户需要输入正确的字符组合以通过验证。
文本验证码可以是纯数字、英文字符或是数字和英文字符的组合。
例子:验证码:A4F6T92. 数学计算验证码数学计算验证码是一种要求用户解决简单数学问题的验证码类型。
通常会给出一个简单的数学算式,用户需要计算出结果并输入。
例子:验证码:5 + 7 = ?3. 图片验证码图片验证码是一种使用图像形式呈现的验证码类型。
图像可以是数字、字母、图形、动物等。
用户需要从一组图片中选择与提示信息相匹配的图片。
例子:验证码:选择包含自行车的图片4. 声音验证码声音验证码是一种使用声音进行验证码验证的类型。
它通常会播放一段随机生成的语音内容,用户需要听取并正确输入该语音内容。
例子:验证码:听取语音输入数字5. 滑动验证码滑动验证码是一种需要用户通过滑动或拖动滑块以完成验证的类型。
用户需要按照提示将滑块滑动到指定位置,以通过验证。
例子:验证码:将滑块滑动到右侧位置以通过验证验证码的优点和应用•防止恶意注册:验证码可以防止自动化机器人进行大量恶意注册,保护网站的用户数据库安全。
•防止暴力破解:验证码可以阻止暴力破解者通过尝试大量可能的组合来猜解密码,提高网站的安全性。
•防止恶意爬虫:验证码可以防止恶意爬虫通过自动化方式抓取网页内容,保护网站的独特信息和数据。
验证码的常见类型总结
验证码的常见类型总结01 前言验证码是一种区分用户是计算机和人的公共全自动程序。
简单来说,验证码就是验证操作是人还是机器。
下面我就总结一下常见的验证码类型都有哪些?02 数字、字母组合这种形式最为常见,也很简单。
有的是单独使用这两种,也有的是数字、字母混合而成,为了提高识别难度,有的会添加干扰线,如在背景中添加干扰线。
代码如下:<?php// 丢弃输出缓冲区的内容 **ob_clean();// 创建画布$image = imagecreatetruecolor(110, 30);// 设置白色底$bgColor = imagecolorallocate($image, 255, 255, 255);imagefill($image, 0, 0, $bgColor);// 添加四个随机数字字母for($i=0;$i<4;$i++) {$fontSize = 6;// 随机分配颜色$fontColor = imagecolorallocate($image, rand(0, 120), rand(0, 120), rand(0, 120));// 生成内容$data = "abcdefghijkmnpqrstuvwxy3456789";// 如果内容为空,重新输出1个do {$fontCont = substr($data, rand(0, strlen($data)), 1);} while ($fontCont == '');// 设置范围$x = ($i*110/4)+rand(5, 10);$y = rand(5, 10);// 图片加入数字imagestring($image, $fontSize, $x, $y, $fontCont, $fontColor); }// 添加干扰点元素for($j=0;$j<200;$j++) {// 点颜色$pointColor = imagecolorallocate($image, rand(50, 200), rand(50, 200), rand(50, 200));imagesetpixel($image, rand(1, 99), rand(1, 29), $pointColor);}// 添加干扰线元素for($z=0;$z<4;$z++) {// 生成颜色线$lineColor = imagecolorallocate($image, rand(80, 220), rand(80, 220), rand(80, 220));imageline($image, rand(1, 99), rand(1, 29), rand(1, 99), rand(1, 29), $lineColor);}header("Content-type:image/png");// 输出图片imagepng($image);// 销毁内存中的图片imagedestroy($image);>03 短信验证码随着手机的普及,为了验证手机号码的真实性,防止恶意注册,通常会向手机发送验证码。
网页验证码原理
网页验证码原理
网页验证码是一种用于验证用户身份的技术,通常用于防止自动化程序和恶意攻击。
其原理是在用户提交表单或进行某些敏感操作时,网页会生成一个随机的图形验证码或文字验证码,并要求用户输入正确的验证码,以证明其为真实用户。
图形验证码的原理是将一段随机生成的字符图片化,即将字符以图片的形式呈现给用户,如将字符转换为扭曲、干扰线、噪点等效果,使得机器难以识别,而人眼相对容易识别。
用户需要将图形验证码中显示的字符正确输入,才能通过验证。
文字验证码的原理类似,但它直接以字符形式展示给用户。
用户需要将文字验证码中显示的字符正确输入,才能通过验证。
为了增加验证码的安全性,通常会设置验证码的有效期限,一般为数分钟。
每次生成的验证码都是唯一的,且只能使用一次。
网页验证码的原理基于人类对于图像和文字的识别能力相对机器的优势,通过要求用户输入正确的验证码,能够较好地防止自动化程序的恶意攻击,提高网站的安全性。
mvtec的verification code
mvtec的verification codeMVTec是一家全球领先的机器视觉软件公司,提供灵活的解决方案和先进的技术,帮助企业实现高效的自动化视觉检测。
在MVTec的解决方案中,验证码(verification code)是一种常见的安全措施,用于确认用户的身份和防止恶意活动。
在本文中,我们将探讨验证码的作用、常见的实现方法以及其在网络安全中的重要性。
首先,验证码的主要目的是确认用户是真实的人类而不是自动化系统或恶意机器人。
通过要求用户输入给定的验证码,系统可以确认用户是通过人类操作来进行访问或提交,从而提高安全性并减少恶意活动的可能性。
验证码通常由数字、字母或其组合组成,以一种相对简单的形式展示给用户。
用户在提交表单、登录账户或进行其他重要操作时,需要正确地填写验证码才能继续进行。
这样的验证方式可以有效降低机器人攻击的风险,因为机器人很难识别或解析验证码。
在实际实现中,验证码通常会使用一些技术手段来确保其难以被机器人攻击或破解。
以下是一些常见的验证码实现方法:1. 图片验证码:这是最常见的一种验证码类型,用户需要根据图片中显示的字母或数字来填写验证码。
图片验证码可以使用曲线、干扰线、噪点等技术手段来增加难度,使机器难以识别。
2. 数学问题验证码:这种验证码要求用户解答一个简单的数学问题,例如计算两个数字的和或乘积。
这种验证码相对简单且容易理解,同时也能防止机器人攻击。
3. 音频验证码:这种验证码类型适用于视觉受限的用户群体。
用户需要听取并正确地输入音频中的数字或字母。
除了上述方法外,还有其他一些创新的验证码实现方式,例如滑动验证码(用户需要通过滑动滑块来验证身份)和图形验证(用户需要根据给定的图形填写相应的验证码)等。
验证码在网络安全中起着重要的作用。
通过使用验证码,网站和应用程序可以有效地防止恶意活动,例如自动化机器人的攻击、恶意软件的传播等。
此外,验证码还可以帮助防止暴力破解密码或账户被盗,因为恶意用户很难破解或绕过验证码。
用阿里云发送验证码使用步骤以及验证码后台校验思路
⽤阿⾥云发送验证码使⽤步骤以及验证码后台校验思路⼀、阿⾥云短信服务使⽤介绍 1、登录阿⾥云官⽹,找到短信服务,选择签名管理 2、添加签名,如何添加⾃⼰看就可以了,很简单,签名内容就是发送短信内容的第⼀句话,这⾥注意的就是通⽤签名现在只有公司才能⽤,个⼈只能⽤验证码签名 3、除了签名以外,还要添加短息模板,我们将通过代码⽅式调⽤⼯具类,传⼊签名、短信模板、⼿机号来发送验证码,模板可以⽤⾃动⽣成的 4、在发送短信时需要进⾏⾝份认证,只有认证通过才能发送短信,所以还需要在阿⾥云的右上⾓点击⽤户,获取密钥 5、⽆论你选则下⾯哪个都⾏,我们选择⼦⽤户,指定⽤户权限,⽽不是分配所有权限。
6、我们要点击编程访问 7、新建⽤户成功后要进⾏授权,⾃⼰找找,懒得放图⽚了,找到创建的⽤户就能看到授权两个字了 8、给新建的⽤户添加权限内容,搜索⼀下短信服务,两个都点上 9、然后就⽣成密钥,就是要注意,因为是点击的编程访问,所以密钥⼀定要记得复制然后保存,因为只会出现这⼀次,以后再也不会出现(我说的密钥就是下图的KeyID和KeySecret) 10、最后记得,这个服务要钱的,只不过不贵就是了 11、java使⽤短信验证码api在官⽹上就能找到,⽤户指南啥的,懒得去看了,我直接把我改了下的⼯具类放在这吧/*** 阿⾥云短信验证⼯具类* */public class AliSNMUtil {public static final String TEMPLET_IDENTIFYING ="SMS_20475xxxx";//发送验证码的模板/**** 发送短信验证码* phone:发送给哪个电话号码,需传⼊* identifyingCode:发送的验证码内容* templet:传⼊短信模板,阿⾥云⾥⾯有*/public static void sendVerification(String phone,Object identifyingCode,String templet) throws ClientException {//设置超时时间-可⾃⾏调整System.setProperty(".client.defaultConnectTimeout", "10000");System.setProperty(".client.defaultReadTimeout", "10000");//初始化ascClient需要的⼏个参数final String product = "Dysmsapi";//短信API产品名称(短信产品名固定,⽆需修改)final String domain = "";//短信API产品域名(接⼝地址固定,⽆需修改)//替换成你的AKfinal String accessKeyId = "xxxxxxxxxxxxxxxxxxx";//你的accessKeyId,参考本⽂档步骤2final String accessKeySecret = "xxxxxxxxxxxxxxxx";//你的accessKeySecret,参考本⽂档步骤2//初始化ascClient,暂时不⽀持多region(请勿修改)IClientProfile profile = DefaultProfile.getProfile("cn-hangzhou", accessKeyId,accessKeySecret);DefaultProfile.addEndpoint("cn-hangzhou", "cn-hangzhou", product, domain);IAcsClient acsClient = new DefaultAcsClient(profile);//组装请求对象SendSmsRequest request = new SendSmsRequest();//使⽤post提交request.setMethod(MethodType.POST);//必填:待发送⼿机号。
验证码的原理及实现方法
验证码的原理及实现方法
一、验证码的原理
验证码,又叫做认证码或者动态口令,是一种动态的密码使用的机制。
简单来说,它是一种随机生成的临时密码,用于验证用户或者系统的身份
确认,主要是用来防止恶意攻击的一种技术。
验证码的最主要的作用就是用于身份识别、保护系统安全性,它需要
用户在使用系统之前先输入一定的字符,才能继续使用系统,用以判断用
户的认证信息,避免恶意的用户登陆系统。
而在验证码输入的过程中,用
户需要正确输入验证码,验证码的文字内容一般由数字或者字母组成,且
每次都是不同的,注意,验证码是不区分大小写字母的,这样,它就可以
防止机器自动登录,即使有人知道用户名和密码也需要输入新的验证码,
才能进行登录,这样就可以有效的防止恶意攻击。
二、实现方法
(1)采用复杂而随机的图形和数字
在系统实现验证码技术时,可以采用复杂而随机的图形和数字来生成
验证码,这样可以降低攻击者破解验证码的可能性。
当用户来到网站时,
系统会生成一个随机的验证码,同时系统会将此验证码与该用户的身份相
关联。
前端验证码原理
前端验证码原理
前端验证码是一种用于验证用户身份的机制,常用于网站登录、注册、重置密码等场景。
它通过向用户展示一组由字母、数字或图片等组成的随机验证码,并要求用户在输入框中填写相应的内容来完成验证。
前端验证码的原理基于人类与计算机在认知能力上的差异。
由于计算机对于特定模式的识别能力相对有限,而人类在视觉上具有丰富的感知能力,因此通过设计一些特定模式的验证码可以较好地区分人类用户和自动化程序。
实现前端验证码的基本步骤如下:
1. 生成验证码:后端服务器根据一定的算法生成一组随机的验证码,并将其存储在会话中或发送给前端页面。
2. 展示验证码:前端页面将验证码展示给用户,通常以图片、字母或数字的形式呈现。
3. 用户填写验证:用户在输入框中填写验证码内容,并提交给服务器进行验证。
4. 验证结果:服务器接收到用户提交的验证码后,与之前存储的验证码进行比对。
如果一致,则判定用户通过验证,否则验证失败。
为了增加验证码的准确性和安全性,还可以采用一些技巧和措施,如:
- 验证码过期时间:限定验证码的有效时间,防止被攻击者长
时间持有或重新使用。
- 图片验证码扭曲变形:在图片验证码中添加一些干扰线、扭曲变形等人类容易辨认但难以被计算机识别的特征,防止被自动化程序破解。
- 验证码刷新:为了防止用户填写错误,可以提供验证码刷新功能,让用户获取新的验证码进行填写。
总的来说,前端验证码通过利用人类与计算机在认知能力上的差异,成功区分人类用户和自动化程序,增强网站的安全性和防护能力。
基于Layui+.netmvc登录界面验证码
基于Layui+.netmvc登录界⾯验证码html<form class="layui-form" role="form" method="post"><div><table style="width:100%" align="center"><tr><td style="padding-bottom:20px;"><input type="text" name="code" id="code" required lay-verify="required" style="border-radius:5px;" placeholder="验证码"class="layui-input"></td><td style="padding-bottom:20px;padding-left:5px;cursor:pointer;width:90px;"><img id="checkloing" src="/Login/VCode" title="看不清,换⼀张"style="border: 1px solid #EEEEEE; border-radius: 5px;" /></td></tr><tr><td colspan="2"><button id="loginBtn"class="layui-btn layui-btn-lg layui-btn-normal" style="width: 98%; background-color: #00BFC1;" lay-submit lay-filter="loginBtn">⽴即登录</button> </td></tr></table></div></form>jse('form', function () {var form = layui.form;var layer = yer;var $ = layui.jquery//layui表单提交⽅法form.on('submit(loginBtn)', function (data) {var user = data.field;$.post('/Login/Login', user, function (res) {if ("success" == res)//如果成功则跳转到指定页⾯location.href = "/Home/";//location.href = "/pageChange/pageChange";else {//失败则弹出失败提⽰layer.msg(res, {offset: 1,shift: 0,area: ['100%', '50px'],time: 3000,scrollbar: false,}, function () {//在登录失败时刷新验证码var str = "?" + Math.random();//加上这句话可以解决验证码不刷新$("#checkloing").attr("src", "/Login/VCode" + str);});}});return false;});});//验证码点击事件$(document).ready(function (e) {$("#checkloing").click(function () {var str = "?" + Math.random();$(this).attr("src", "/Login/VCode" + str);})});Controllersusing COMMON;using System;using System.Web.Mvc;namespace SFMVC3._0.Controllers{public class LoginController : Controller{///<summary>///登录///</summary>///<param name="code"></param>///<returns></returns>[HttpPost]public string Login(string code){string str = Session["code"].ToString();str = str.ToLower();code = code.ToLower();if (str != vccode){return"验证码错误";}return"success";}///<summary>///验证码点击事件///</summary>///<returns></returns>public ActionResult VCode(){limitCodeHelper vcode = new limitCodeHelper();string codeStr = vcode.GetRandomCode();if (!string.IsNullOrEmpty(codeStr)){byte[] arrImg = vcode.GetVCode(codeStr);Session["code"] = codeStr;return File(arrImg, "image/gif");}else{return RedirectToAction("/Login/VCode?rand=" + Guid.NewGuid().ToString().Substring(1, 10), "image/jpeg"); }}}}Dalusing System;using System.Drawing;namespace COMMON{//验证码绘制public class limitCodeHelper{private static Color BackColor = Color.White;private static int Width = 100;private static int Height = 36;private int letterWidth = 24;//单个字体的宽度范围private Random _random;// private string _code;private int _brushNameIndex;private string[] fonts = { "Arial", "Georgia" };public byte[] GetVCode(string codeStr){_random = new Random();Bitmap img = new Bitmap(Width, Height);using( Graphics g = Graphics.FromImage(img)) {Random random = new Random();//⽩⾊背景g.Clear(Color.White);//画图⽚的背景噪⾳线for (int i = 0; i < 10; i++){int x1 = random.Next(img.Width);int x2 = random.Next(img.Width);int y1 = random.Next(img.Height);int y2 = random.Next(img.Height);g.DrawLine(new Pen(Color.Silver), x1, y1, x2, y2);}//随机字体和颜⾊的验证码字符for (int int_index = 0; int_index < codeStr.Length; int_index++){string str_char = codeStr.Substring(int_index, 1);Brush newBrush = new SolidBrush(GetRandomColor());Point thePos = new Point(int_index * letterWidth + 1 + _random.Next(3), 1 + _random.Next(3));g.DrawString(str_char, new Font(GetFont().FontFamily, 18, FontStyle.Bold), newBrush, thePos);}//灰⾊边框//g.DrawRectangle(new Pen(Color.LightGray, 1), 0, 0, Width - 1, (Height - 1));//图⽚扭曲img = TwistImage(img, true, 3, 4);//将⽣成的图⽚发回客户端g.DrawRectangle(Pens.DarkGray, 0, 0, Width - 1, Height - 1);//绘画边框using (System.IO.MemoryStream ms = new System.IO.MemoryStream()){//将图⽚保存到内存流中img.Save(ms, System.Drawing.Imaging.ImageFormat.Gif);//将内存流⾥的数据转成 byte 数组返回return ms.ToArray();}}}///<summary>///绘画⽂字///</summary>///<param name="g"></param>private void Paint_Text(Graphics g, string code){g.DrawString(code, GetFont(), GetBrush(), 3, 1);}///<summary>///绘画⽂字噪⾳点///</summary>///<param name="g"></param>private void Paint_TextStain(Bitmap b){string[] BrushName = new string[] { "OliveDrab","ForestGreen","DarkCyan","LightSlateGray","RoyalBlue","SlateBlue","DarkViolet","MediumVioletRed","IndianRed","Firebrick","Chocolate","Peru"," enrod"};for (int n = 0; n < 30; n++){int x = _random.Next(Width);int y = _random.Next(Height);b.SetPixel(x, y, Color.FromName(BrushName[_brushNameIndex])); }}///<summary>///随机取⼀个字体///</summary>///<returns></returns>private Font GetFont(){string[] FontItems = new string[]{ "Arial","Helvetica","Geneva","sans-serif","Verdana"};int fontIndex = _random.Next(0, FontItems.Length);FontStyle fontStyle = GetFontStyle(_random.Next(0, 2));return new Font(FontItems[fontIndex], 12, fontStyle);}/**//**//**////<summary>///随机取⼀个笔刷///</summary>///<returns></returns>private Brush GetBrush(){Brush[] BrushItems = new Brush[]{ Brushes.OliveDrab,Brushes.ForestGreen,Brushes.DarkCyan,Brushes.LightSlateGray,Brushes.RoyalBlue,Brushes.SlateBlue,Brushes.DarkViolet,Brushes.MediumVioletRed,Brushes.IndianRed,Brushes.Firebrick,Brushes.Chocolate,Brushes.Peru,Brushes.Goldenrod};int brushIndex = _random.Next(0, BrushItems.Length);_brushNameIndex = brushIndex;return BrushItems[brushIndex];}///<summary>///绘画背景颜⾊///</summary>///<param name="g"></param>private void Paint_Background(Graphics g){g.Clear(BackColor);}/**//**//**////<summary>///取⼀个字体的样式///</summary>///<param name="index"></param>///<returns></returns>private FontStyle GetFontStyle(int index){switch (index){case0:return FontStyle.Bold;case1:return FontStyle.Italic;default:return FontStyle.Regular;}}///<summary>///取得⼀个 4 位的随机码///</summary>///<returns></returns>public string GetRandomCode(){return Guid.NewGuid().ToString().Substring(0, 4);}///<summary>///随机颜⾊///</summary>///<returns></returns>public Color GetRandomColor(){Random RandomNum_First = new Random((int)DateTime.Now.Ticks);System.Threading.Thread.Sleep(RandomNum_First.Next(50));Random RandomNum_Sencond = new Random((int)DateTime.Now.Ticks);int int_Red = RandomNum_First.Next(210);int int_Green = RandomNum_Sencond.Next(180);int int_Blue = (int_Red + int_Green > 300) ? 0 : 400 - int_Red - int_Green;int_Blue = (int_Blue > 255) ? 255 : int_Blue;return Color.FromArgb(int_Red, int_Green, int_Blue);// 5+1+a+s+p+x}///<summary>///扭曲图⽚///</summary>///<param name="srcBmp"></param>///<param name="bXDir"></param>///<param name="dMultValue"></param>///<param name="dPhase"></param>///<returns></returns>public System.Drawing.Bitmap TwistImage(Bitmap srcBmp, bool bXDir, double dMultValue, double dPhase) {double PI = 6.283185307179586476925286766559;Bitmap destBmp = new Bitmap(srcBmp.Width, srcBmp.Height);Graphics graph = Graphics.FromImage(destBmp);graph.FillRectangle(new SolidBrush(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 ? (PI * (double)j) / dBaseAxisLen : (PI * (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);Color color = srcBmp.GetPixel(i, j);if (nOldX >= 0 && nOldX < destBmp.Width&& nOldY >= 0 && nOldY < destBmp.Height){destBmp.SetPixel(nOldX, nOldY, color);}}}srcBmp.Dispose();return destBmp;}}}。
C#系统登录随机验证码生成及其调用方法
C#系统登录随机验证码⽣成及其调⽤⽅法话不多说,直接上代码public ValidateCode(){}///<summary>///验证码的最⼤长度///</summary>public int MaxLength{get { return10; }}///<summary>///验证码的最⼩长度///</summary>public int MinLength{get { return1; }}///<summary>///⽣成验证码///</summary>///<param name="length">指定验证码的长度</param>///<returns></returns>public string CreateValidateCode(int length){int[] randMembers = new int[length];int[] validateNums = new int[length];string validateNumberStr = "";//⽣成起始序列值int seekSeek = unchecked((int)DateTime.Now.Ticks);Random seekRand = new Random(seekSeek);int beginSeek = (int)seekRand.Next(0, Int32.MaxValue - length * 10000);int[] seeks = new int[length];for (int i = 0; i < length; i++){beginSeek += 10000;seeks[i] = beginSeek;}//⽣成随机数字for (int i = 0; i < length; i++){Random rand = new Random(seeks[i]);int pownum = 1 * (int)Math.Pow(10, length);randMembers[i] = rand.Next(pownum, Int32.MaxValue);}//抽取随机数字for (int i = 0; i < length; i++){string numStr = randMembers[i].ToString();int numLength = numStr.Length;Random rand = new Random();int numPosition = rand.Next(0, numLength - 1);validateNums[i] = Int32.Parse(numStr.Substring(numPosition, 1));}//⽣成验证码for (int i = 0; i < length; i++){validateNumberStr += validateNums[i].ToString();}return validateNumberStr;}///<summary>///创建验证码的图⽚///</summary>///<param name="context">要输出到的page对象</param>///<param name="validateNum">验证码</param>public void CreateValidateGraphic(string validateCode, HttpContext context){Bitmap image = new Bitmap((int)Math.Ceiling(validateCode.Length * 12.0), 22);Graphics g = Graphics.FromImage(image);try{//⽣成随机⽣成器Random random = new Random();//清空图⽚背景⾊g.Clear(Color.White);//画图⽚的⼲扰线for (int 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 Font("Arial", 12, (FontStyle.Bold | FontStyle.Italic));LinearGradientBrush brush = new LinearGradientBrush(new Rectangle(0, 0, image.Width, image.Height), Color.Blue, Color.DarkRed, 1.2f, true);g.DrawString(validateCode, font, brush, 3, 2);//画图⽚的前景⼲扰点for (int i = 0; i < 100; i++){int x = random.Next(image.Width);int y = random.Next(image.Height);image.SetPixel(x, y, Color.FromArgb(random.Next()));}//画图⽚的边框线g.DrawRectangle(new Pen(Color.Silver), 0, 0, image.Width - 1, image.Height - 1);//保存图⽚数据MemoryStream stream = new MemoryStream();image.Save(stream, ImageFormat.Jpeg);//输出图⽚流context.Response.Clear();context.Response.ContentType = "image/jpeg";context.Response.BinaryWrite(stream.ToArray());}finally{g.Dispose();image.Dispose();}}///<summary>///得到验证码图⽚的长度///</summary>///<param name="validateNumLength">验证码的长度</param>///<returns></returns>public static int GetImageWidth(int validateNumLength){return (int)(validateNumLength * 12.0);}///<summary>///得到验证码的⾼度///</summary>///<returns></returns>public static double GetImageHeight(){return22.5;}//C# MVC 升级版///<summary>///创建验证码的图⽚///</summary>///<param name="containsPage">要输出到的page对象</param>///<param name="validateNum">验证码</param>public byte[] CreateValidateGraphic(string validateCode){Bitmap image = new Bitmap((int)Math.Ceiling(validateCode.Length * 12.0), 22);Graphics g = Graphics.FromImage(image);try{//⽣成随机⽣成器Random random = new Random();//清空图⽚背景⾊g.Clear(Color.White);//画图⽚的⼲扰线for (int 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 Font("Arial", 12, (FontStyle.Bold | FontStyle.Italic));LinearGradientBrush brush = new LinearGradientBrush(new Rectangle(0, 0, image.Width, image.Height), Color.Blue, Color.DarkRed, 1.2f, true);g.DrawString(validateCode, font, brush, 3, 2);//画图⽚的前景⼲扰点for (int i = 0; i < 100; i++){int x = random.Next(image.Width);int y = random.Next(image.Height);image.SetPixel(x, y, Color.FromArgb(random.Next()));}//画图⽚的边框线g.DrawRectangle(new Pen(Color.Silver), 0, 0, image.Width - 1, image.Height - 1);//保存图⽚数据MemoryStream stream = new MemoryStream();image.Save(stream, ImageFormat.Jpeg);//输出图⽚流return stream.ToArray();}finally{g.Dispose();image.Dispose();}}其中有两个根据数字和字母⽣成图⽚验证码的⽅法,相信⼤家能够明⽩,第⼀种是常规的WebForm后台调⽤的⽅法,可以i直接返回相应的验证码图⽚,第⼆种则是专门为准备的⽅法,其实就是筛检了⼀点东西,然后传⼊参数也发⽣了相应的变化,当然,还有点击“看不清,换⼀张”的时候,会异步获取新的数据,实现⽅法在⽂章末尾。
SpringMVC单文件上传与多文件上传实例
SpringMVC单⽂件上传与多⽂件上传实例⼀、简述⼀个javaWeb项⽬中,⽂件上传功能⼏乎是必不可少的,本⼈在项⽬开发中也时常会遇到,以前也没怎么去理它,今天有空学习了⼀下这⽅⾯的知识,于是便将本⼈学到的SpringMVC中单⽂件与多⽂件上传这部分知识做下笔记。
⼆、单⽂件上传1、页⾯这⾥以⼀个简单的表单提交为例⼦,⽂件上传需要将表单的提交⽅法设置为post,将enctype的值设置为"multipart/form-data"。
<form action="${pageContext.request.contextPath}/test/upload.do" method="post" enctype="multipart/form-data"><input type="file" name="img"><br /><input type="submit" name="提交"></form>2、控制器在Controller的处理⽅法中,使⽤MultipartFile对象作为参数接收前端上传过来的⽂件,具体说明请看代码注释。
@Controller@RequestMapping("/test")public class MyController {@RequestMapping(value = "/upload.do", method = RequestMethod.POST)// 这⾥的MultipartFile对象变量名跟表单中的file类型的input标签的name相同,所以框架会⾃动⽤MultipartFile对象来接收上传过来的⽂件,当然也可以使⽤@RequestParam("img")指定其对应的参数名称 public String upload(MultipartFile img, HttpSession session)throws Exception {// 如果没有⽂件上传,MultipartFile也不会为null,可以通过调⽤getSize()⽅法获取⽂件的⼤⼩来判断是否有上传⽂件if (img.getSize() > 0) {// 得到项⽬在服务器的真实根路径,如:/home/tomcat/webapp/项⽬名/imagesString path = session.getServletContext().getRealPath("images");// 得到⽂件的原始名称,如:美⼥.pngString fileName = img.getOriginalFilename();// 通过⽂件的原始名称,可以对上传⽂件类型做限制,如:只能上传jpg和png的图⽚⽂件if (fileName.endsWith("jpg") || fileName.endsWith("png")) {File file = new File(path, fileName);img.transferTo(file);return "/success.jsp";}}return "/error.jsp";}}3、springmvc.xml配置使⽤MultipartFile对象接收前端上传过来的⽂件,还需要在springmvc的配置⽂件中进⾏如下配置:<?xml version="1.0" encoding="UTF-8"?><beans xmlns="/schema/beans"xmlns:mvc="/schema/mvc" xmlns:xsi="/2001/XMLSchema-instance"xmlns:aop="/schema/aop" xmlns:tx="/schema/tx"xmlns:context="/schema/context"xsi:schemaLocation="/schema/beans/schema/beans/spring-beans.xsd/schema/tx/schema/tx/spring-tx.xsd/schema/mvc/schema/mvc/spring-mvc.xsd/schema/aop/schema/aop/spring-aop.xsd/schema/context/schema/context/spring-context.xsd">...<!-- 注意:CommonsMultipartResolver的id是固定不变的,⼀定是multipartResolver,不可修改 --><bean id="multipartResolver" class="monsMultipartResolver"><!-- 如果上传后出现⽂件名中⽂乱码可以使⽤该属性解决 --><property name="defaultEncoding" value="utf-8"/><!-- 单位是字节,不设置默认不限制总的上传⽂件⼤⼩,这⾥设置总的上传⽂件⼤⼩不超过1M(1*1024*1024) --><property name="maxUploadSize" value="1048576"/><!-- 跟maxUploadSize差不多,不过maxUploadSizePerFile是限制每个上传⽂件的⼤⼩,⽽maxUploadSize是限制总的上传⽂件⼤⼩ --><property name="maxUploadSizePerFile" value="1048576"/></bean><!-- 设置⼀个简单的异常解析器,当⽂件上传超过⼤⼩限制时跳转 --><bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"><property name="defaultErrorView" value="/error.jsp"/></bean></beans>上⾯配置⽂件中的CommonsMultipartResolver下的属性值配置不是必须的,你也可以全部不写。
C# winform登陆框验证码的实现
验证码技术已愈来愈成熟,从最初的数字、字母、字符、汉字已经到目前的语言,其应用也甚广,之前大多数只有在网站上可以看到,现在在一些客户端软件也经常可见(比如证券相关软件)。
之前做的一个基于 C# 客户端连 J2EE 应用的项目,其 Login Form 也要求实现验证码,在此贴上。
1、新建一个简单的 windows 应用项目在默认的 Form1 中添加如下控件:1) Label : text = “输入验证码 :”2) TextBox : name=” txtValidCode”输入验证码的文本框3) Image : name=” picValidCode”显示验证码的图片控件4) Button :单击事件进行验证码验证2、新建一个产生验证码的核心类,并构建其一个实例: ValidCode validCode = new ValidCode (5, ValidCode .CodeType .Numbers)using System;using System.Collections.Generic;using System.Text;using System.IO;using System.Drawing;using System.Drawing.Drawing2D;namespace BigHorseLib.Security{public class ValidCode{#region Private Fieldsprivate const double PI = 3.1415926535897932384626433832795; private const double PI2 = 6.283185307179586476925286766559; //private readonly int _wordsLen = 4;private int _len;private CodeType _codetype;private readonly Single _jianju = (float )18.0;private readonly Single _height = (float )24.0;private string _checkCode;#endregion#region Public Propertypublic string CheckCode{get{return _checkCode;}}#endregion#region Constructors/// <summary>/// public constructors/// </summary>/// <param name="len"> 验证码长度 </param>/// <param name="ctype"> 验证码类型:字母、数字、字母+ 数字 </param> public ValidCode(int len, CodeType ctype){this ._len = len;this ._codetype = ctype;}#endregion#region Public Fieldpublic enum CodeType {Words, Numbers, Characters, Alphas }#endregion#region Private Methodsprivate string GenerateNumbers(){string strOut = "" ;System.Random random = new Random ();for (int i = 0; i < _len; i++){string num = Convert .ToString(random.Next(10000)%10);strOut += num;}return strOut.Trim();}private string GenerateCharacters(){string strOut = "" ;System.Random random = new Random ();for (int i = 0; i < _len; i++){string num = Convert .ToString((char )(65+random.Next(10000)%26)); strOut += num;}return strOut.Trim();}//private string GenerateAlphas(){string strOut = "" ;string num = "" ;System.Random random = new Random ();for (int i = 0; i < _len; i++){if (random.Next(500) % 2 == 0){num = Convert .ToString(random.Next(10000) % 10);}else{num = Convert .ToString((char )(65 + random.Next(10000) % 26));}strOut += num;}return strOut.Trim();}private 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 Methodspublic Stream CreateCheckCodeImage(){string checkCode;switch (_codetype){case CodeType .Alphas:checkCode = GenerateAlphas();break ;case CodeType .Numbers:checkCode = GenerateNumbers();break ;case CodeType .Characters:checkCode = GenerateCharacters();break ;default :checkCode = GenerateAlphas();break ;}this ._checkCode = checkCode;MemoryStream ms = null ;//if (checkCode == null || checkCode.Trim() == String .Empty)return null ;Bitmap image = new System.Drawing.Bitmap ((int )Math .Ceiling((checkCode.Length * _jianju)), (int )_height);Graphics g = Graphics .FromImage(image);try{Random random = new Random ();g.Clear(Color .White);// 画图片的背景噪音线for (int i = 0; i < 18; 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 .FromArgb(random.Next()),1), x1, y1, x2, y2);}Font font = new System.Drawing.Font ("Times New Roman" , 14, System.Drawing.FontStyle .Bold);LinearGradientBrush brush = new LinearGradientBrush (new Rectangle (0, 0, image.Width, image.Height), Color .Blue, Color .DarkRed, 1.2f, true );if (_codetype != CodeType .Words){for (int i = 0; i < checkCode.Length; i++){g.DrawString(checkCode.Substring(i, 1), font, brush, 2 + i * _jianju,1);}}else {g.DrawString(checkCode, font, brush, 2, 2);}// 画图片的前景噪音点for (int i = 0; i < 150; i++){int x = random.Next(image.Width);int y = random.Next(image.Height);image.SetPixel(x, y, Color .FromArgb(random.Next()));}// 画图片的波形滤镜效果if (_codetype != CodeType .Words){image = TwistImage(image, true , 3, 1);}// 画图片的边框线g.DrawRectangle(new Pen (Color .Silver), 0, 0, image.Width - 1, image.Height -1);ms = new System.IO.MemoryStream ();image.Save(ms, System.Drawing.Imaging.ImageFormat .Gif);}finally{g.Dispose();image.Dispose();}return ms;}#endregion}}3、图片加载验证码、验证码验证// 图片加载验证码picValidCode.Image = Bitmap .FromStream(validCode.CreateCheckCodeImage())// 验证if (!this .txtValidCode.Text.Equals(_validCode.CheckCode)){MessageBox .Show(" 请输入正确的验证码!" , this .Text);this .txtValidCode.Focus();return ;}。
java实现短信验证码5分钟有效时间
java实现短信验证码5分钟有效时间本⽂实例为⼤家分享了java实现短信验证码5分钟有效时间,供⼤家参考,具体内容如下实现⼀个发送短信验证码的请求,要求5分钟之内重复请求,返回同⼀个验证码。
⽹上可找到⼏种⽅案:如,存储数据库或缓存中。
实现起来⽐较⿇烦,舍弃;另⼀种⽅式即本例,使⽤session存储。
其他⽅式,暂未进⼀步了解。
实现步骤:(springmvc)1、controller中,获取session对象,取code,取不到新⽣成,并存储session中;2、单⼿机号发送量,判断并 +1 记⼊数据库;3、Timer定时器,设置新线程延时执⾏TimerTask任务(删除code)@RequestMapping(value = "sendMessage",method = RequestMethod.GET)public Object sendMessage(final HttpServletRequest request){String phone=request.getParameter("phone");int times=userService.messageSendToday(phone); //⼆次验证,单个⼿机号每⽇发送上限if(times <= MAX_PER_DAY){String checkCode=GenerateRandomCode.createRandomNumber(6);final HttpSession httpSession=request.getSession();httpSession.setAttribute("checkCode",checkCode);CheckCodeMessage checkCodeMessage=new CheckCodeMessage(phone,checkCode);try {HttpSender.batchSend(checkCodeMessage);//TimerTask实现5分钟后从session中删除checkCodefinal Timer timer=new Timer();timer.schedule(new TimerTask() {@Overridepublic void run() {httpSession.removeAttribute("checkCode");System.out.println("checkCode删除成功");timer.cancel();}},5*60*1000);} catch (Exception e) {e.printStackTrace();}return "redirect:/index.jsp";}}Timer定时任务://TimerTask实现5分钟后从session中删除checkCodefinal Timer timer=new Timer();timer.schedule(new TimerTask() {@Overridepublic void run() {httpSession.removeAttribute("checkCode");System.out.println("checkCode删除成功");timer.cancel();}},5*60*1000);以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。
验证码——实现前端验证码验证(后端登陆注册功能)
验证码——实现前端验证码验证(后端登陆注册功能) 点开这个页⾯⾸先恭喜你!——可以学到⼀个⾮常简单的在⽤户登陆注册的时候⽤前端实现的验证码验证的功能. 我的项⽬框架为SSM框架,⽤户的登陆注册以及⽤户信息的增删改查等等其他的功能时通过java后端技术实现的,对于验证码功能只需要在login.html添加部分代码即可实现。
⽹上的我也搜过查看了好多,但是都是⾮常繁琐,有前后端分离的、接⼝调⽤的、添加⼯具类的,⽆论是什么⽅法他们都有⼀个共同的特点——代码冗长繁琐,其次就是和⾃⼰所要⽤的⽅法出⼊太⼤,借鉴起来很⿇烦,看了半天⽤处不是多⼤,所以在此我总结了下,给⼤家展⽰⼀个简单的⽅法去实现验证码验证的功能,希望对⼤家有所帮助!话不多说,上代码!没错,就这么的简单.在scripts⽣成验证码设为全局变量显⽰在⼀个input标签上,⾸先不考虑登录信息是否有误,只有验证码通过的情况下才会进⾏表单的提交,在判断登录信息的正确与否.代码如下,需要的直接拷贝<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN""/TR/html4/loose.dtd"><html><head><title>login</title><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><script src="/myfirstssm/js/jquery-1.11.3.min.js"></script><style type="text/css">#code {font-family: Arial;font-style: italic;font-weight: bold;border: 0;letter-spacing: 2px;color: blue;}</style><script>//产⽣验证码window.onload = function() {createCode();var timeDiv = document.getElementById("time");window.setInterval(function(){timeDiv.innerHTML = new Date().toLocaleString();}, 1000);};var code; //在全局定义验证码function createCode() {code = "";var codeLength = 4; //验证码的长度var checkCode = document.getElementById("code");var random = new Array(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'); //随机数for(var i = 0; i < codeLength; i++) { //循环操作var index = Math.floor(Math.random() * 36); //取得随机数的索引(0~35)code += random[index]; //根据索引取得随机数加到code上}checkCode.value = code; //把code值赋给验证码}function check(){var inputCode = document.getElementById("ctl00_txtcode").value.toUpperCase();var username = $("#username").val();var password = $("#password").val();if(username=="" || password==""||inputCode==""){alert("输⼊信息不能为空,请完善信息!");return false;}else if(inputCode!=code){alert("验证码输⼊错误,请重新输⼊!");createCode(); //刷新验证码document.getElementById("ctl00_txtcode").value = ""; //清空⽂本框return false;}return true;}</script></head><body><br/><br/><br/><br/><br/><div id="wrap"><div id="top_centent" ><div id="header"><!-- style="color:DodgerBlue;" --><div id="leftheader" ></div><div id="topheader" ><h1 id="title" style="text-align:center;" ><a href="#" style="text-decoration: none;color:black">管理员</a></h1></div><div id="navigation"></div><CENTER><font color="red"><!-- <span id="message">${@}</span> --></font></CENTER></div><div id="content"><form action="/myfirstssm/jsp/login.action" method="post" onsubmit="return check()"><table cellpadding="0" cellspacing="20" border="0"class="form_table" align="center"><tr><td valign="middle" align="right">⽤ 户 名:</td><td valign="middle" align="left"><input type="text" name="username" id="username" /></td></tr><tr><td valign="middle" align="right">密 码:</td><td valign="middle" align="left"><input type="password" name="password" id="password" /></td></tr><tr><td valign="middle" align="right">验 证 码:</td><td valign="middle" align="left"><input type="text" id="ctl00_txtcode" /></td><td valign="middle"><input type="button" id="code" onclick="changeImg()"/></td></table><p style="text-align:center"><input type="submit"class="button" value="登陆" /><input type="button"class="button" value="注册"onclick="location='/myfirstssm/jsp/register.html'" /><input type="reset" name="reset" value="重置"/></p></form></div></div><form action="/myfirstssm/jsp/finduser.action" method="post" ><P style="text-align:center;"><input type="submit"class="button" value="⽤户信息" /></P></form><div><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><div style="text-align:left">Copyright © 2019⾬如烟</div><div id="time" style="text-align:right"></div></div></div></body></html>认真看过此篇的⼩伙伴,如果对你有收获,请点击旁边的⼩⼿推荐⼀下,如果有误,欢迎指正,谢谢!版权声明:此篇为本⼈原创,转载请标明出处:https:///YQian/p/11323443.html我的博客园地址:https:///YQian/。
前端开发实训案例网页验证码的生成与验证
前端开发实训案例网页验证码的生成与验证前端开发实训案例网页验证码的生成与验证为了保证网页的安全性和防止机器人恶意攻击,很多网站在用户进行注册、登录或者提交表单等操作时会要求用户输入验证码。
验证码是一种基于图像识别的技术,通过生成和验证验证码,可以有效防止机器人的自动化行为,确保用户身份的真实性。
本文将介绍前端开发中实现网页验证码的生成与验证的案例,并提供相应的代码实例。
1. 网页验证码的生成在前端开发中,验证码的生成是通过服务器端应用和前端代码联动来实现的。
以下是一种常见的验证码生成方法:首先,我们需要在服务器端生成验证码图片。
可以使用第三方库、自定义脚本或开源工具来实现这一步骤。
生成验证码图片的关键是要确保图片上的字符是随机的、干扰元素适当,并且字体、大小、颜色等可配置。
接下来,在前端页面中使用<img>标签将验证码图片展示给用户。
同时,在用户填写验证码的输入框旁边提供一个刷新按钮,点击按钮可以重新加载生成新的验证码图片。
2. 网页验证码的验证用户输入验证码后,前端需要将验证码的值发送给服务器端进行验证。
下面是一个网络验证码验证的示例过程:首先,前端需要获取用户输入的验证码值,可以使用JavaScript的相关API来获取。
然后,前端通过AJAX等方式将验证码的值发送给服务器端。
服务器端会将用户输入的验证码值与之前生成的验证码值进行比对。
如果验证码验证成功,服务器端会返回一个验证通过的信息(如JSON格式的数据)给前端;否则,返回一个验证失败的信息。
前端根据服务器端返回的响应,可以展示相应的提示信息给用户,例如验证码正确、验证码错误等提示。
3. 安全性考虑为了保证验证码的安全性,防止机器人攻击,有以下几点需要注意:首先,生成的验证码要足够随机,不能出现重复的情况,且需要有一定复杂度。
可以使用混合字母、数字和特殊字符的组合,增加验证码的难度。
其次,验证码的图片要有适当的干扰元素,使机器无法简单识别。
数学运算表达式形式的验证码
数学运算表达式形式的验证码/// <summary>/// 数学算式的验证码/// </summary>public sealed class MathVerifyCode{#region ⽣成图⽚/// <summary>/// 输出验证码表达式到浏览器/// </summary>/// <param name="context">httpcontext</param>/// <param name="sessionKey">保存运算值的SESSION的KEY</param>public void OutputImage(System.Web.HttpContext context, string sessionKey){int mathResult = 0;string expression = null;Random rnd = new Random();////⽣成3个10以内的整数,⽤来运算int operator1 = rnd.Next(0, 10);int operator2 = rnd.Next(0, 10);int operator3 = rnd.Next(0, 10);////随机组合运算顺序,只做 + 和 * 运算switch (rnd.Next(0, 3)){case 0:mathResult = operator1 + operator2 * operator3;expression = string.Format("{0} + {1} * {2} = ?", operator1, operator2, operator3);break;case 1:mathResult = operator1 * operator2 + operator3;expression = string.Format("{0} * {1} + {2} = ?", operator1, operator2, operator3);break;default:mathResult = operator2 + operator1 * operator3;expression = string.Format("{0} + {1} * {2} = ?", operator2, operator1, operator3);break;}using (Bitmap bmp = new Bitmap(150, 25)){using (Graphics graph = Graphics.FromImage(bmp)){graph.Clear(Color.FromArgb(232, 238, 247)); ////背景⾊,可⾃⾏设置////画噪点for (int i = 0; i <= 128; i++){graph.DrawRectangle(new Pen(Color.FromArgb(rnd.Next(0, 255), rnd.Next(0, 255), rnd.Next(0, 255))),rnd.Next(2, 128),rnd.Next(2, 38),1,1);}////输出表达式for (int i = 0; i < expression.Length; i++){graph.DrawString(expression.Substring(i, 1),new Font(FontFamily.GenericSansSerif, 12, FontStyle.Bold),new SolidBrush(Color.FromArgb(rnd.Next(255), rnd.Next(128), rnd.Next(255))),5 + i * 10,rnd.Next(1, 5));}////画边框,不需要可以注释掉graph.DrawRectangle(new Pen(Color.Firebrick), 0, 0, 150 - 1, 25 - 1);}context.Session[sessionKey] = mathResult; ////将运算结果存⼊session////禁⽤缓存DisableHttpCache(context);////输出图⽚到浏览器,我采⽤的是 gif 格式,可⾃⾏设置其他格式context.Response.ContentType = "image/gif";bmp.Save(context.Response.OutputStream, System.Drawing.Imaging.ImageFormat.Gif);context.Response.End();}}#endregion/// <summary>/// 禁⽤缓存/// </summary>/// <param name="context">httpcontext</param>private static void DisableHttpCache(System.Web.HttpContext context){////清除http缓存context.Response.ClearHeaders();context.Response.ClearContent();////禁⽤http缓存//// http 1.1context.Response.AddHeader("Expires", "Mon, 26 Jul 1997 05:00:00 GMT");context.Response.AddHeader("Cache-Control", "no-store, no-cache, max-age=0, must-revalidate");//// http 1.0context.Response.AddHeader("Pragma", "no-cache");}}注:如果觉得验证码太模糊,可以将画噪点的地⽅调整为下⾯的:for (int i = 0; i <= 128; i++){graph.DrawRectangle(new Pen(Color.FromArgb(rnd.Next(0, 255), rnd.Next(0, 255), rnd.Next(0, 255))),(float)rnd.Next(2, 128),(float)rnd.Next(2, 38),0.5F, //噪点的粒度0.5F);//噪点的粒度,可以调节这两个值,到认为⾃⼰满意}使⽤说明:。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
ValidateCode vCode = new ValidateCode();
string code = vCode.CreateValidateCode(4);
Session["ValidateCode"] = code;
byte[] bytes = vCode.CreateValidateGraphic(code);
seeks[i] = beginSeek;
}
//生成随机数字
for (int i = 0; i < length; i++)
{
Random rand = new Random(seeks[i]);
int pownum = 1 * (int)Math.Pow(10, length);
randMembers[i] = rand.Next(pownum, Int32.MaxValue);
1)写一个类生成验证码(ValidateCode.cs):
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Drawing;
using System.Drawing.Drawing2D;
/// </summary>
/// <returns></returns>
public static double GetImageHeight()
{
return 23;
}
}
}
2)Controller的代码:
public ActionResult GetValidateCode()
//清空图片背景色
g.Clear(Color.White);
//画图片的干扰线
for (int 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 Font("Arial", 12, (FontStyle.Bold | FontStyle.Italic));
/// <returns></returns>
public static int GetImageWidth(int validateNumLength)
{
return (int)(validateNumLength * 12.0);
}
/// <summary>
/// 得到验证码的高度
$(function() {
$("#ValidCode").click(function() {
this.src = "/User/GetValidateCode?time=" + (new Date()).getTime();
});
});
/// 生成验证码
/// </summary>
/// <param name="length">指定验证码的长度</param>
/// <returns></returns>
public string CreateValidateCode(int length)
{
int[] randMembers = new int[length];
using System.IO;
using System.Drawing.Imaging;
namespace MvcDemo.web
{
public class ValidateCode
{
public ValidateCode()
{
}
/// <summary>
/// 验证码的最大长度
int beginSeek = (int)seekRand.Next(0, Int32.MaxValue - length * 10000);
int[] seeks = new int[length];
for (int i = 0; i < length; i++)
{
beginSeek += 10000;
{
Bitmap image = new Bitmap((int)Math.Ceiling(validateCode.Length * 12.0), 22);
Graphics g = Graphics.FromImage(image);
try
{
//生成随机生成器
Random random = new Random();
/// </summary>
public int MaxLength
{
get { return 10; }
}
/// <summary>
/// 验证码的最小长度
/// </summary>
public int MinLength
{
get { return 1; }
}
/// <summary>
int[] validateNums = new int[length];
string validateNumberStr = "";
//生成起始序列值
int seekSeek = unchecked((int)DateTime.Now.Ticks);
Random seekRand = new Random(seekSeek);
}
//画图片的边框线
g.DrawRectangle(new Pen(Color.Silver), 0, 0, image.Width - 1, image.Height - 1);
//保存图片数据
MemoryStream stream = new MemoryStream();
image.Save(stream, ImageFormat.Jpeg);
string[] fontName = { "华文新魏", "宋体", "圆体", "黑体", "隶书" };
Font font = new Font(fontName[new Random().Next(0, validateCode.Length)], 12, (FontStyle.Bold | FontStyle.Italic));
}
return validateNumberStr;
}
/// <summary>
/// 创建验证码的图片
/// </summary>
/// <param name="validateCode">验证码</param>
public byte[] CreateValidateGraphic(string validateCode)
//输出图片流
return stream.ToArray();
}
finally
{
g.Dispose();
image.Dispose();
}
}
/// <summary>
/// 得到验证码图片的长度
/// </summary>
/// <param name="validateNumLength">验证码的长度</param>
return File(bytes, @"image/gif");
}
3)在页面上显示的代码:
<img id="ValidCode" style="cursor: pointer;" src="/User/GetValidateCode" alt="验证码" />
4)js代码切换验证码:
}
//抽取随机数字
for (int i = 0; i < length; i++)
{ ቤተ መጻሕፍቲ ባይዱ
string numStr = randMembers[i].ToString();
int numLength = numStr.Length;
Random rand = new Random();
int numPosition = rand.Next(0, numLength - 1);
validateNums[i] = Int32.Parse(numStr.Substring(numPosition, 1));
}
//生成验证码
for (int i = 0; i < length; i++)