Java Web网站通用图形验证码的实现
2023-04-11
来源:小侦探旅游网
电脑编程技巧与维护 Java Web 网站通用图形验证码的实现 潘勇 (上海工程技术大学电子电气学院,上海201620) 摘要:Web网站的安全是开发人员要重点考虑因素之一,为提高系统安全性,普遍使用图形验证码技术。讨论了 常用的网站验证码技术,提出了一种通用的实现方法。 关键词:Java语言;图形验证码 Java Web Website Graphics Verification Code Implementation PAN Yong (Shanghai University of Engineering Science Electronic Electrical Institute,Shanghai 201620,China) Abstract:the security of Web sites is the developer to focus on one of the factors,improving the security of the system,will generally use graphics veriifcation code technology,this paper discusses the common site veriicatifon code technology, presents a general realization method. Key words:Java;graphics code 1 前言 网站的安全是开发人员必须考虑的中重要因素,考虑不 全面就会给系统使用者和管理者带来严重问题,例如恶意用 密码:<input type”password name=”pwd”> 验证码:<input type=”text”name:”check_code”> <img src=”servlet/CheckCode”> 户频繁发送相同信息造成不良影响,或者通过不断尝试盗取 用户名和密码,为了解决这样的问题,可以使用验证码技术。 验证码从理论上是是一种区分用户是计算机和人的公共全自 动程序。通过验证码可以防止:恶意破解密码、刷票、论坛 <input type=”submit”value:”确定”> </form> 程序运行如图1所示。 灌水,有效防止某个黑客对某一个特定注册用户用特定程序 暴力破解方式进行不断的登录尝试,验证码通常使用一些线 条和一些不规则的字符组成,主要作用是为了防止一些黑客 把密码数据化盗取。 2 验证码技术的发展 经历了3个阶段:早期是使用数字形式显示在网页上, 恶意者可以很容易地通过复制粘贴来输入(或者直接使用软 件来获取),接着出现了规则数字图片,也就是直接用网页产 (2)创建服务器端程序CheckCode,产生带有随机验证码 的图片: t‘mpoa java.awt.Color; 。lmpo ̄java.awt.Font; ‘lmpo ̄java.awt.Graphics; ’lmpo ̄java.awt.image.Bufferedlmage; i埘lport java.io.IOException; 生数字图片,不能被复制粘贴,但是恶意者可以使用OCR功 能用软件来自动判断图片上的数字,现在一般使用对图片显 示的数字或文字进行特殊处理,增加其他杂色,来干扰OCR 软件的读取。 下面利用比较简易的方式实现了网站验证码功能,具有 一‘ ̄mport java.io.OutputStream; ‘import java.util.Random; 定的通用性。 ‘import javax.imageio.ImagelO; public class CheckCode{ 3 图形验证码的实现 为了限制浏览者利用软件来暴力猜测密码,通过在服务 ,/验证码图片中可以出现的字符集,可根据需要修改 private char mapTable【】={ a ,,b , c ,,d , e , f , g ,1l , 器端编程的方式来实现验证码。首先,通过服务器端程序产 生一个验证码,然后在登录页面显示生成的验证码,最后让 i ,,j ,1( ,,m , n , p ,,q ,,r , s , t ,,u , v , w , x , y , z , 0 , 2 , 3 ,,4 , 5 , 6 , 浏览者把验证码手工填写在相应的地方,为了不增加浏览者 的麻烦,验证码不宜过长,通常为4个随机字符。具体步骤 如下: 7 , 8 ,,9 l; 参数width为生成图片的宽度,参数height为生成图 片的高度,参数OS为页面的输出流 , public String getCertPic(im width,int height,Output- (1)编写登录页面代码Login.jsp,在该页面显示验证码图 片,代码如下: <form action:”servlet/Logon”method=”post”> 作者简介:潘勇(1972一),讲师,硕士,研究方向:数据库、 Web开发。 收稿日期:2012—07—18 用户名:<input type=”text” name=”name”> 器 与 NETW0RK AND C0MMUNICA nON Stream os) { if(width<=0)width=60; if(height<=0)height=20; Bufferedlmage image=new Bufferedlmage(width, height, BufferedImage.TYPE_INT RGB); ,/获取图形上下文 Graphics g image.getGraphics 0; ,,设定背景色 g.setColor(new Color(0xDCDCDC)); g.ifllRect(0,0,width,heighO; //画边框 g.setColor(Color.black); g.drawRect(0,0,width—l,height-1); ,/取随机产生的认证码 String strEnsure=…’: ,/4代表4位验证码,如果要生成更多位的认证码, ,,贝U加大数值 for(inti=0;i<4;++ { s ̄Ensure+=mapTable【(int) (mapTable. 1ength Math.random())】; } ,,将认证码显示到图像中,如果要生成更多位的认证 ,/码,增加drawString语句 g.setColor(Color.black); g.setFont(new Font C Atlantic Inline”,oFnt.PLAIN, 18)); String str=strEnsure.substring(0,1); g.drawStirng(str,8,17); str:strEnsure.substring(1,2); g.drawstring(str,20,15); sir=strEnsure.substring(2,3); g.drawString(str,35,18); str=strEnsure.substring(3,4); g.drawString(str,45,15); ,/随机产生20个干扰点 Random rand=newRandom 0: for(int i=0;i<20;i++) { int x=rnad.nextlnt(width): int Y=rand.nextInt(height); g.rdawOval(x,Y,1,1); } ,/释放图形上下文 g.dispose 0; try{ ,/输出图像到页面 ImagelO.write(image,”JPEG”,OS); }catch(IOException e) { retum…’; l return strEnsure; } ) (3)创建服务器端程序Logon,用来处理登录表单的请 求: 网络与通信 import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class Logon extends HttpServlet{ public void service(HttpServletRequest request, HttpServletResponse response) htrows ServletException,IOException{ MakeCertPic image=new MakeCertPic 0; String str=image.getCertPic(0,0,response.getOutput- Stream()); 鹇验证码存入sesseion request.getSession().setAttribute(”checkCode”, str); } l (4)最后,在web.xml中对上述Servlet进行配置: <servlet> <servlet-name>CheckCode</servlet-name> <servlet-class>sues.servlet.CheckCode</servlet-class> </servlet> <servlet-mapping> <servlet-name>CheckCode</servlet—name> <url-pattem>/servlet/CheckCode</url-pattem> /<servlet-mapping> <servlet> <servlet-name>Logon</servlet-name> <servlet-class>sues.servlet.Logon</servlet-class> /<servlet> <servlet—mapping> <servlet-name>Logon</servlet-name> <url-pattem>/servlet/Logon</url-pattem> /<servlet-mapping> 4 结语 在J Web开发中,图形验证码是普遍使用的一项技 术,通过编程实现指定字符集的图形验证码的生成,为了避 免程序的自动识别,对验证码添加干扰点,算法具有完整注 释说明,读者可以在理解基础上,进一步完善,使之适应各 种情况。 参考文献 【1】李俊青.Java EE Web开发与项目实战.华中科技大学出 版社,2011. [2】刘斌.精通Java Web整合开发.电子工业出版社,2011.4. [3】李刚.轻量级Java EE企业应用实战.电子工业出版社, 2011.