全国统一服务热线:400-633-9193

Jsp servlet验证码工具类分享

    网络     2018-06-15    1213

昨晚在csdn看到一位前辈写一个ajax+servlet+jsp验证,顿时心血来潮,在阅读前辈的代码下我亲手体验一下,做了一个验证码生成工具类,以供大家做个参考。

1、添加VeriyCodeUtils类生成验证码图像

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
package com.servlet;
  
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.OutputStream;
import java.util.Random;
  
import javax.imageio.ImageIO;
  
/**
 *
 * @author hubiao
 *  验证码生成器
 * 用到API
 *  BufferedImage 创建一个图像
 *  Graphics2D 绘制
 *   fillRect(x,y,width,height);背景
 *   font()字体
 *   drawRect();边框
 *   drawLine();线
 *   drwaString:图像数据
 *  ImageIO 生成图像
 */
public class VeriyCodeUtils {
 /**
  * @param output 保存验证图像的流
  * @return 验证码
  */
 public static String newVeriyCode(OutputStream output)
 {
  int width = 90;
  int height = 40;
  int codeCount = 5;
  char[] codeSequence = { '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', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' };
    
  //创建图像对象,8位RGB
  BufferedImage buffered = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
    
  //通过Crapahices来绘制图像到BufferedImage中
  Graphics2D gra = buffered.createGraphics();
    
  //设置图片背景:白色
  gra.setColor(Color.WHITE);
  gra.fillRect(0, 0, width, height);
    
  //设置字体,字体大小根据图片高度决定
  gra.setFont(new Font("Fixedsys",Font.PLAIN,height-2));
    
  //设置边框:黑色,1cm
  gra.setColor(Color.BLACK);
  gra.drawRect(0, 0, width-1, height-1);
    
  //生成10条黑色干扰线
  gra.setColor(Color.BLACK);
  Random ran = new Random();
  for(int i = 0; i < 70;i++)
  {
   int x = ran.nextInt(255);
   int y = ran.nextInt(255);
   int x1 = ran.nextInt(255);
   int y1 = ran.nextInt(255);
   gra.drawLine(x, y,x+x1, y+y1);//画直线
  }
  //生成验证码
  StringBuffer sb = new StringBuffer();
  int r = 0,g = 0,b = 0;
  for(int i = 0; i < codeCount; i++)
  {
   String strRand = String.valueOf(codeSequence[ran.nextInt(codeSequence.length)]);
   //对每位验证码都生成不同的颜色,增加识别系统难度
   r = ran.nextInt(255);
   g = ran.nextInt(255);
   b = ran.nextInt(255);
   gra.setColor(new Color(r, g, b));
   gra.drawString(strRand, (i+1)*13, height-4);
   sb.append(strRand);
  }
  try {
   ImageIO.write(buffered, "jpeg", output);
  } catch (Exception e) {
   throw new RuntimeException(e);
  }
    
  return sb.toString();
 }
}

2、servlet使用验证码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
   throws ServletException, IOException {
  //禁止图像缓存
  resp.setHeader("Pragma", "no-cache"); 
  resp.setHeader("Cache-Control", "no-cache"); 
  resp.setDateHeader("Expires", 0); 
  resp.setContentType("image/jpeg");
    
  //生成验证码图像
  String veriyCode = VeriyCodeUtils.newVeriyCode(resp.getOutputStream());
    
  //将验证码保存到session中
  HttpSession session = req.getSession();
  session.setAttribute("validateCode", veriyCode);
 }

3、JSP页面使用验证码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
</head>
 <script type="text/javascript">
  function createCode()
  {
   var t = new Date().getTime();//防止页面缓存,使用时间搓
   var srcImg = document.getElementById("srcImg");
   srcImg.src="/ImgVeifyWeb/vity.do?"+t;
  }
 </script>
 <body>
 <h1>${requestScope.code}</h1>
 <img id="srcImg" src="<c:url value="/vity.do"></c:url>" /> #这里使用直接让img访问servlet,通过response响应一个图像流
 <a href="##" rel="external nofollow" id="codeId" onclick="createCode()">换一张</a>
 <form action="<c:url value="/hello.do"></c:url>" method="post">
  <input type="text" name="codeVify"/>
  <input type="submit" value="提交"/>
 </form>
 </body>

4、校验验证码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
   throws ServletException, IOException {
  HttpSession session = req.getSession();
  Object validateCode = session.getAttribute("validateCode");
  System.out.println(validateCode);
    
  String codeVify = req.getParameter("codeVify");
  if(codeVify==null || codeVify.equals(""))
  {
   req.setAttribute("code","验证证不能为空");
   req.getRequestDispatcher("/index.jsp").forward(req, resp);
   return;
  }else if(!validateCode.toString().equalsIgnoreCase(codeVify))
  {
   req.setAttribute("code","验证证错误");
   req.getRequestDispatcher("/index.jsp").forward(req, resp);
   return;
  }
  System.out.println("下面开始 做其他业务操作....");
 }

校验图如下:


  分享到:  
0.1943s