验证码的Servlet实现

1.验证码及其作用

    验证码:就是将一串随机产生的数字或符号,生成一幅图片, 图片里加上一些干扰象素(防止OCR),由用户肉眼识别其中的验证码信息,输入表单提交网站验证,验证成功后才能使用某项功能。 

    作用:验证码一般是防止有人利用机器人自动批量注册、对特定的注册用户用特定程序暴力破解方式进行不断的登陆、灌水。因为验证码是一个混合了数字或符号的图片,人眼看起来都费劲,机器识别起来就更困难。像百度贴吧未登录发贴要输入验证码大概是防止大规模匿名回帖的发生。

2.示例目录结构


3.详细代码

AuthCode.java

[java]  view plain copy print ?
  1. public class AuthCode {  
  2.     public static final int AUTHCODE_LENGTH = 5;        //验证码长度  
  3.     public static final int SINGLECODE_WIDTH = 15;  //单个验证码宽度  
  4.     public static final int SINGLECODE_HEIGHT = 30//单个验证码高度  
  5.     public static final int SINGLECODE_GAP = 4;     //单个验证码之间间隔  
  6.     public static final int IMG_WIDTH = AUTHCODE_LENGTH * (SINGLECODE_WIDTH + SINGLECODE_GAP);  
  7.     public static final int IMG_HEIGHT = SINGLECODE_HEIGHT;  
  8.       
  9.     public static String getAuthCode() {  
  10.         String authCode = "";  
  11.         for(int i = 0; i < AUTHCODE_LENGTH; i++) {  
  12.             authCode += (new Random()).nextInt(10);  
  13.         }  
  14.         return authCode;  
  15.     }  
  16.       
  17.     public static BufferedImage getAuthImg(String authCode) {  
  18.         //设置图片的高、宽、类型  
  19.         //RGB编码:red、green、blue  
  20.         BufferedImage img = new BufferedImage(IMG_WIDTH, IMG_HEIGHT, BufferedImage.TYPE_INT_BGR);  
  21.         //得到图片上的一个画笔  
  22.         Graphics g = img.getGraphics();  
  23.         //设置画笔的颜色,用来做背景色  
  24.         g.setColor(Color.YELLOW);  
  25.         //用画笔来填充一个矩形,矩形的左上角坐标,宽,高  
  26.         g.fillRect(00, IMG_WIDTH, IMG_HEIGHT);  
  27.         //将画笔颜色设置为黑色,用来写字  
  28.         g.setColor(Color.BLACK);  
  29.         //设置字体:宋体、不带格式的、字号  
  30.         g.setFont(new Font("宋体", Font.PLAIN, SINGLECODE_HEIGHT + 5));  
  31.           
  32.         //输出数字  
  33.         char c;  
  34.         for(int i = 0; i < authCode.toCharArray().length; i++) {  
  35.             //取到对应位置的字符  
  36.             c = authCode.charAt(i);  
  37.             //画出一个字符串:要画的内容,开始的位置,高度  
  38.             g.drawString(c + "", i * (SINGLECODE_WIDTH + SINGLECODE_GAP)+ SINGLECODE_GAP / 2, IMG_HEIGHT);  
  39.         }  
  40.         Random random = new Random();  
  41.         //干扰素  
  42.         for(int i = 0; i < 20; i++) {  
  43.             int x = random.nextInt(IMG_WIDTH);  
  44.             int y = random.nextInt(IMG_HEIGHT);  
  45.             int x2 = random.nextInt(IMG_WIDTH);  
  46.             int y2 = random.nextInt(IMG_HEIGHT);  
  47.             g.drawLine(x, y, x + x2, y + y2);  
  48.         }  
  49.         return img;  
  50.     }  
  51. }  
getAuthCodeServlet.java

[java]  view plain copy print ?
  1. public class getAuthCodeServlet extends HttpServlet {  
  2.   
  3.     public void doGet(HttpServletRequest request, HttpServletResponse response)  
  4.             throws ServletException, IOException {  
  5.         String authCode = AuthCode.getAuthCode();  
  6.           
  7.         request.getSession().setAttribute("authCode", authCode);    //将验证码保存到session中,便于以后验证  
  8.           
  9.         try {  
  10.             //发送图片  
  11.             ImageIO.write(AuthCode.getAuthImg(authCode), "JPEG", response.getOutputStream());  
  12.         } catch (IOException e){  
  13.             e.printStackTrace();  
  14.         }  
  15.     }  
  16.   
  17. }  
index.jsp

[plain]  view plain copy print ?
  1. <%@ page language="java" contentType="text/html; charset=UTF-8"  
  2.     pageEncoding="UTF-8"%>  
  3. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">  
  4. <html>  
  5. <head>  
  6.   
  7. <script>  
  8.     function refresh() {  
  9.         document.getElementById("authImg").src = "getAuthCode.do";  
  10.     }  
  11. </script>  
  12.   
  13. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">  
  14. <title>Insert title here</title>  
  15. </head>  
  16. <body>  
  17.     <form action="checkCode.jsp" method="post">  
  18.         <img src="getAuthCode.do" id="authImg"/><a href="#" onClick="refresh()">看不清</a><br>  
  19.         <input type="text" name="inputCode"><br>  
  20.         <input type="submit" value="提交">  
  21.     </form>  
  22. </body>  
  23. </html>  

checkCode.jsp

[plain]  view plain copy print ?
  1. <%@ page language="java" contentType="text/html; charset=UTF-8"  
  2.     pageEncoding="UTF-8"%>  
  3.   
  4. <%  
  5.     if(request.getParameter("inputCode").equals(session.getAttribute("authCode"))) {  
  6.         out.print("输入正确");  
  7.     }else{  
  8.         out.print("输入错误");  
  9.     }  
  10. %>  
  11.     <a href="javascript:history.go(-1)">返回</a>  

4.实现效果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值