昨晚在 csdn 看到一位前辈写一个 Ajax+servlet+jsp 验证, 顿时心血来潮, 在阅读前辈的代码下我亲手体验一下, 做了一个验证码生成工具类, 以供大家做个参考.
1, 添加 VeriyCodeUtils 类生成验证码图像
- 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 使用验证码
- 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 页面使用验证码
- </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, 校验验证码
- 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("下面开始 做其他业务操作....");
- }
校验图如下:
来源: https://www.jb51.net/article/139270.htm