实验1-验证码的Java实现.doc
- 文档编号:14763277
- 上传时间:2023-06-27
- 格式:DOC
- 页数:8
- 大小:52.54KB
实验1-验证码的Java实现.doc
《实验1-验证码的Java实现.doc》由会员分享,可在线阅读,更多相关《实验1-验证码的Java实现.doc(8页珍藏版)》请在冰点文库上搜索。
南昌航空大学实验报告
2015年月日
课程名称:
信息安全概论实验名称:
验证码的Java实现
学号:
姓名:
指导老师评定:
签名:
一、实验目的
通过实验了解验证码的原理,掌握Java语言验证码的实现。
二、实验原理
1.验证码的定义
验证码(CAPTCHA)是“CompletelyAutomatedPublicTuringtesttotellComputersandHumansApart”(全自动区分计算机和人类的图灵测试)的缩写,是一种区分用户是计算机还是人的公共全自动程序。
这个问题可以由计算机生成并评判,但是必须只有人类才能解答。
由于计算机无法解答CAPTCHA的问题,所以回答出问题的用户就可以被认为是人类。
2.验证码的作用:
可以防止恶意破解密码、刷票、论坛灌水,有效防止黑客对注册用户用特定程序暴力破解方式进行不断地登录尝试,实际上用验证码是现在很多网站通行的方式。
利用比较简易的方式实现这个功能,虽然登录麻烦一点,但是对用户的密码安全来说这个功能还是很有必要,也很重要。
3.验证码的使用
大多数网站的验证码都是需要点击一下填写框,然后会自动弹出验证码图片。
由于验证码是随机产生的,有很大几率会出现无法清楚识别的验证码图片,所以需要注意的是,一般网站都会有相应的提示,如“看不清,换一张”等,如果没有提示,则直接点击当前的验证码图片,可以完成验证码的更换。
(1)登录时使用:
防止暴力破解密码
(2)注册时使用:
防止自动批量注册
(3)发帖时使用:
防止自动灌水、发广告
三、实验环境
开发工具:
JDK、Eclipse
参考资料:
JDKAPI文档
java.awt包
java.awt.event包
javax.swing包
四、实验内容和任务
使用Java语言编程,实现登录时生成验证码的功能。
五、实验要求
(1)登录时,系统随机生成验证码,并显示在图片中;
(2)用户输入用户名、密码和验证码后,系统先判断验证码是否正确,如果不正确,则重新随机生成一个新的验证码,等待用户再次输入;
(3)如果输入的验证码正确,再判断用户名和密码是否正确,判断是否登录成功。
六、程序代码
(1)创建RandomImageGenerator.java类,实现验证码图片的生成。
packagecom.tenghu.code;
importjava.awt.Color;
importjava.awt.Font;
importjava.awt.Graphics2D;
importjava.awt.image.BufferedImage;
importjava.io.FileNotFoundException;
importjava.io.FileOutputStream;
importjava.io.IOException;
importjava.io.OutputStream;
importjava.util.Random;
importjavax.imageio.ImageIO;
/**
*验证码生成类
*@authorxiaohu
*
*/
publicclassRandomImageGenerator{
//创建Random对象
staticRandomrandom=newRandom();
//随机生成包含验证码字符串
publicstaticStringrandom(intnum){
String[]str={"0","1","2","3","4","5","6","7","8","9",
"a","b","c","d","e","f","g","h","i","j",
"k","l","m","n","p","q","r","s","t"};
intnumber=str.length;
//接收随机字符
Stringtext="";
//随机产生4个字符的字符串
for(inti=0;i text+=str[random.nextInt(number)]; } returntext; } /** *随机产生定义的颜色 * *@return */ privatestaticColorgetRandColor(){ Randomrandom=newRandom(); Colorcolor[]=newColor[10]; color[0]=newColor(32,158,25); color[1]=newColor(218,42,19); color[2]=newColor(31,75,208); color[3]=newColor(0,102,182); color[4]=newColor(171,0,85); returncolor[random.nextInt(5)]; } /** *产生随机字体 * *@return */ privatestaticFontgetFont(){ Randomrandom=newRandom(); Fontfont[]=newFont[5]; font[0]=newFont("Ravie",Font.BOLD,30); font[1]=newFont("AntiqueOliveCompact",Font.BOLD,30); font[2]=newFont("Forte",Font.BOLD,30); font[3]=newFont("WideLatin",Font.BOLD,30); font[4]=newFont("GillSansUltraBold",Font.BOLD,30); returnfont[random.nextInt(5)]; } /** *生成图片 *@throwsIOException */ publicstaticvoidrender(StringrandomStr,OutputStreamout,int width,intheight)throwsIOException{ //在内存中创建图像 BufferedImagebi=newBufferedImage(width,height, BufferedImage.TYPE_BYTE_INDEXED); //获取图形上下文 Graphics2Dg=(Graphics2D)bi.getGraphics(); //话边框 g.setColor(Color.white); g.fillRect(0,0,width,height); g.setFont(getFont()); g.setColor(Color.BLACK); //画认证码,每个认证码在不同的水平位置 Stringstr1[]=newString[randomStr.length()]; for(inti=0;i str1[i]=randomStr.substring(i,i+1); intw=0; intx=(i+1)%3; //随机生成验证码字符水平偏移量 if(x==random.nextInt(7)){ w=30-random.nextInt(7); }else{ w=30+random.nextInt(7); } //随机生成颜色 g.setColor(getRandColor()); g.drawString(str1[i],20*i+10,w); } //随机产生干扰点,并用不同的颜色表示,事图像的认证码不易被其他程序探测到 for(inti=0;i<100;i++){ intx=random.nextInt(width); inty=random.nextInt(height); Colorcolor=newColor(random.nextInt(255),random.nextInt(255), random.nextInt(255)); //随机画各种颜色的线 g.setColor(color); g.drawOval(x,y,0,0); } //画干扰线 for(inti=0;i<15;i++){ intx=random.nextInt(width); inty=random.nextInt(height); intx1=random.nextInt(width); inty1=random.nextInt(height); Colorcolor=newColor(random.nextInt(255),random.nextInt(255), random.nextInt(255)); //随机画各种颜色线 g.setColor(color); g.drawLine(x,y,x1,y1); } //图像生效 g.dispose(); //输出页面 ImageIO.write(bi,"jpg",out); } publicstaticvoidmain(String[]args)throws FileNotFoundException,IOException{ //获取随机字符串 StringrandomStr=random(5); System.out.println(randomStr); //生成图片 render(randomStr,newFileOutputStream("D: \\test.jpg"),130,40); } } (2).创建RandomImageServlet.java,将生成的验证码输出到页面 ackagecom.tenghu.code.servlet; importjava.io.IOException; importjavax.servlet.ServletException; importjavax.servlet.http.HttpServlet; importjavax.servlet.http.HttpServletRequest; importjavax.servlet.http.HttpServletResponse; importjavax.servlet.http.HttpSession; importcom.tenghu.code.RandomImageGenerator; publicclassRandomImageServletextendsHttpServlet{ //图片宽度 intwidth=0; //图片高度 intheight=0; //图片上随机字符个数 intrandomStrNum=0; publicvoiddestroy(){ } publicvoiddoGet(HttpServletRequestrequest,HttpServletResponse response) throwsServletException,IOException{ doPost(request,response); } publicvoiddoPost(HttpServletRequestrequest,HttpServletResponse response) throwsServletException,IOException{ request.setCharacterEncoding("UTF-8"); //获取HttpSession对象 HttpSessionsession=request.getSession(); //获取随机字符串 StringrandomStr=RandomImageGenerator.random(randomStrNum); if(null! =session){ //设置参数 session.setAttribute("randomStr",randomStr); //设置响应类型,输出图片客户端不缓存 response.setDateHeader("Expires",1L); response.setHeader("Cache-Control","no-cache,no-store,max- age=0"); response.addHeader("Pragma","no-cache"); response.setContentType("image/jpeg"); //输出到页面 RandomImageGenerator.render(randomStr,response.getOutputStream (),width,height); } } publicvoidinit()throwsServletException{ //获取宽度 width=Integer.parseInt(this.getInitParameter("width")); //获取高度 height=Integer.parseInt(this.getInitParameter("height")); //获取个数 randomStrNum=Integer.parseInt(this.getInitParameter("num")); } } (3).创建LoginAction.java类,控制登录 packagecom.tenghu.code.action; importjava.io.ByteArrayInputStream; importjava.io.InputStream; importcom.opensymphony.xwork2.ActionContext; importcom.opensymphony.xwork2.ActionSupport; publicclassLoginActionextendsActionSupport{ //用户名 privateStringuserName; //密码 privateStringpassword; //验证码 privateStringcode; privateInputStreaminputStream; publicInputStreamgetResult(){ returninputStream; } //成功 publicStringsuccess()throwsException{ returnSUCCESS; } //测试登录 publicStringtestLogin()throwsException{ //获取图片的验证码 StringrandomStr=(String)ActionContext.getContext().getSession ().get("randomStr"); if(code.trim().equalsIgnoreCase(randomStr)){ if("admin".equals(userName.trim())&&"admin".equals(password.trim ())){ //成功 inputStream=newByteArrayInputStream("1".getBytes("UTF-8")); }else{ //用户名或密码错误 inputStream=newByteArrayInputStream("2".getBytes("UTF-8")); } }else{ //验证码错误 inputStream=newByteArrayInputStream("0".getBytes("UTF-8")); } return"result"; } publicStringgetUserName(){ returnuserName; } publicvoidsetUserName(StringuserName){ this.userName=userName; } publicStringgetPassword(){ returnpassword; } publicvoidsetPassword(Stringpassword){ this.password=password; } publicStringgetCode(){ returncode; } publicvoidsetCode(Stringcode){ this.code=code; } } 七、小结 通过本次实验我了解了验证码的原理
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验 验证 Java 实现