Java生成验证码工具
2016-02-23 09:48
543 查看
首先创建一个 CheckCodeUtil.java
package com.gj5u.publics.util; import java.awt.BasicStroke; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.geom.AffineTransform; import java.awt.image.BufferedImage; import java.io.IOException; import java.util.Random; import javax.imageio.ImageIO; import javax.servlet.http.HttpServletResponse; /** * 验证码生成工具 * @author Rex * */ public class CheckCodeUtil { /** * 获取随机颜色 * @param s 颜色取值范围最小值 * @param e 颜色取值范围最大值 * @return 颜色 */ private static Color getRandColor(int s, int e) { Random random = new Random(); if (s > 255) s = 255; if (e > 255) e = 255; int r = s + random.nextInt(e - s); int g = s + random.nextInt(e - s); int b = s + random.nextInt(e - s); return new Color(r, g, b); } /** * 获取字体大小 * * @param width * 画布宽 * @param height * 画布高 * @param codeCount * 随机数量 * @return */ private static Integer getFontSize(Integer width, Integer height, Integer codeCount) { Integer result = 25; if (height >= 40) { result = height - 10; } if (width >= 100) { Integer s = (width - 10) / codeCount; if (s < result) { result = s; } } return result; } /** * 获取随机字符串 * * @param codeCount * 字符长度 * @return */ private static String getRandString(Integer codeCount) { Random random = new Random(); // 实例化一个Random对象 String sRand = ""; int itmp = 0; for (int i = 0; i < codeCount; i++) { if (random.nextInt(2) == 1) { itmp = random.nextInt(26) + 65; // 生成A~Z的字母 } else { itmp = random.nextInt(10) + 48; // 生成0~9的数字 } char ctmp = (char) itmp; sRand += String.valueOf(ctmp); } return sRand; } /** * 随机生成验证码 * * @param response * @param width * @param height * @param codeCount * @return * @throws IOException */ public static String CheckCodeImg(HttpServletResponse response, Integer width, Integer height, Integer codeCount) throws IOException { if (EmptyUtil.isEmpty(codeCount)) { codeCount = 4; } String CodeStr = getRandString(codeCount); Integer fontsize = getFontSize(width, height, codeCount); // 禁止缓存 response.setHeader("Pragma", "No-cache"); response.setHeader("Cache-Control", "No-cache"); response.setDateHeader("Expires", 0); // 指定生成的响应是图片 response.setContentType("image/jpeg"); // int width = 200; // int height = 60; BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); // 创建BufferedImage类的对象 Graphics g = image.getGraphics(); // 创建Graphics类的对象 Graphics2D g2d = (Graphics2D) g; // 通过Graphics类的对象创建一个Graphics2D类的对象 Random random = new Random(); // 实例化一个Random对象 Font mFont = new Font("Arial", Font.BOLD, fontsize); // 通过Font构造字体 g.setColor(getRandColor(200, 250)); // 改变图形的当前颜色为随机生成的颜色 g.fillRect(0, 0, width, height); // 绘制一个填色矩形 // 画一条折线 BasicStroke bs = new BasicStroke(2f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL); // 创建一个供画笔选择线条粗细的对象 g2d.setStroke(bs); // 改变线条的粗细 g.setColor(Color.DARK_GRAY); // 设置当前颜色为预定义颜色中的深灰色 int[] xPoints = new int[3]; int[] yPoints = new int[3]; for (int j = 0; j < 3; j++) { xPoints[j] = random.nextInt(width - 1); yPoints[j] = random.nextInt(height - 1); } g.drawPolyline(xPoints, yPoints, 3); // 生成并输出随机的验证文字 g.setFont(mFont); char[] in = new char[CodeStr.length()]; for (int i = 0; i < CodeStr.length(); i++) { in[i] =CodeStr.charAt(i); Color color = new Color(20 + random.nextInt(110), 20 + random.nextInt(110), 20 + random.nextInt(110)); g.setColor(color); /**** 随机缩放文字并将文字旋转指定角度 **/ // 将文字旋转指定角度 Graphics2D g2d_word = (Graphics2D) g; AffineTransform trans = new AffineTransform(); trans.rotate(random.nextInt(45) * 3.14 / 180, 15 * i + 5, 5); // 缩放文字 float scaleSize = random.nextFloat() + 0.8f; if (scaleSize > 1.1f) scaleSize = 1f; trans.scale(scaleSize, scaleSize); g2d_word.setTransform(trans); /************************/ g.drawString(String.valueOf(in[i]), 15 * i +fontsize+15, 18); } g.dispose(); ImageIO.write(image, "JPEG", response.getOutputStream()); return CodeStr; } }
在页面中使用:
package com.gj5u.service; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.stereotype.Service; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import <span style="font-family: Arial, Helvetica, sans-serif;">com.gj5u.publics.util</span><span style="font-family: Arial, Helvetica, sans-serif;">.CheckCodeUtil;</span> @Service @RequestMapping("/imgcode") public class Imgcode { @RequestMapping(value = "/check", method = RequestMethod.GET) public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException, WriterException { String codes= CheckCodeUtil.CheckCodeImg(response, 100, 35, 5); //将此放到Cokie中 } }
相关文章推荐
- java自动生成验证码插件-kaptcha
- 如何识别高级的验证码的技术总结第1/4页
- PHP 验证码不显示只有一个小红叉的解决方法
- asp汉字中文图片验证码
- PHP实现简单汉字验证码
- php生成动态验证码gif图片
- php生成验证码函数
- 基于JavaScript短信验证码如何实现
- php 验证码制作(网树注释思想)
- 基于C#实现12306的动态验证码变成静态验证码的方法
- C#验证码识别基础方法实例分析
- javascript点击才出现验证码
- node.js WEB开发中图片验证码的实现方法
- 深入学习.net验证码生成及使用方法
- jQuery Real Person验证码插件防止表单自动提交
- 验证码的三个常见漏洞和修复方法
- asp.net简单生成验证码的方法
- 声音验证码制作方法
- jsp实现简单验证码的方法
- jsp 生成验证码代码