生成图形验证码
2015-10-13 16:47
316 查看
做了好几次图形验证的需求了,今天好好总结一下,将自己的代码备份一下,便于自己以后方面开发
在做项目的注册用户的时候,一般我们都会用验证码进行验证,那么我们的验证码怎么来了,有3个方法:
1、单纯的用数字进操作,
2、用已有图片进行绑定的方式;
3、在后台自动生成。
这里将的方式就是第三种。
ImageCode.java
jsp代码:
注意:如果用Spring MVC框架开的话,可以利用
spring
MVC中引入captcha的插件生成图片验证码
具体查看,Spring mvc 自动生成图片验证码
在做项目的注册用户的时候,一般我们都会用验证码进行验证,那么我们的验证码怎么来了,有3个方法:
1、单纯的用数字进操作,
2、用已有图片进行绑定的方式;
3、在后台自动生成。
这里将的方式就是第三种。
ImageCode.java
package com.jzt.b2b.util; import java.awt.Color; import java.awt.Font; import java.awt.Graphics2D; import java.awt.geom.AffineTransform; import java.awt.image.BufferedImage; import java.util.Random; import javax.imageio.ImageIO; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletResponse; /** * @author hushengyou 生成图形验证码 */ public class ImageCode { // 图片的宽度 private final static int IMAGEWIDTH = 120; // 图片的高度 private final static int IMAGEHEIGHT = 30; // 字体大小 private final static int FONTSIZE = 14; // 字符串长度 private final static int CODE_LENGTH = 6; // 随机字符范围 private final static char[] CHAR_RANGE = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789".toCharArray(); private static Random random = new Random(); /** * 获得图片缓冲流 */ public String getImageCode(HttpServletResponse response) { // 设置不缓存图片 response.setHeader("Pragma", "no-cache"); response.setHeader("Cache-Control", "no-cache"); response.setDateHeader("Expires", 0); // 指定生成的相应图片 response.setContentType("image/jpeg"); // 生成画布 //IMAGEWIDTH * CODE_LENGTH BufferedImage image = new BufferedImage(IMAGEWIDTH, IMAGEHEIGHT, BufferedImage.TYPE_INT_RGB); // 获取图形上下文 (生成画笔) Graphics2D graphics = image.createGraphics(); // 设置背景色() graphics.setColor(getRandomColor(200, 255)); // 设置字体 graphics.setFont(new Font("Times New Roman", Font.BOLD, FONTSIZE)); // 填充矩形区域 ,绘制背景 graphics.fillRect(0, 0, IMAGEWIDTH, IMAGEHEIGHT); graphics.setColor(getRandomColor(180, 200)); // 绘制随机干扰线 drawRandomLines(graphics, 160); // 获取随机字符 String code = getRandomString(); // 绘制随机字符 drawRandomString(graphics, code); // 图像生效 graphics.dispose(); try { ServletOutputStream sos = response.getOutputStream(); ImageIO.write(image, "jpeg", sos); sos.flush(); sos.close(); } catch (Exception e) { e.printStackTrace(); } return code; } /** * 生成指定字符串的图像 * * @param verifyCode 即将被打印的随机字符串 * @return 生成的图像 */ private static void drawRandomString(Graphics2D graphics, String code) { Color color = new Color(20 + random.nextInt(20), 20 + random.nextInt(20), 20 + random.nextInt(20)); // 设置边框颜色 graphics.setColor(color); // // 画出边框 // for (int i = 0; i < 2; i++) // graphics.drawRect(i, i, IMAGEWIDTH * CODE_LENGTH - i * 2 - 1, IMAGEHEIGHT - i * 2 - 1); // 画字符串 for (int i = 0; i < CODE_LENGTH; i++) { String temp = code.substring(i, i + 1); // 想文字旋转一定的角度 AffineTransform trans = new AffineTransform(); trans.rotate(random.nextInt(45) * 3.14 / 180, 15 * i + 8, 7); // 缩放文字 float scaleSize = random.nextFloat() + 0.8f; if (scaleSize > 1f) scaleSize = 1f; trans.scale(scaleSize, scaleSize); graphics.setTransform(trans); graphics.setColor(getRandomColor(0, 180)); // 设置字体位于的位置(字,x轴,y轴) graphics.drawString(temp, 15 * i + 18, 14); } } /** * 生成随机字符串 * * @return 随机字符串 */ public static String getRandomString() { StringBuilder sb = new StringBuilder(); for (int i = 0; i < CODE_LENGTH; i++) { sb.append(CHAR_RANGE[random.nextInt(CHAR_RANGE.length)]); } return sb.toString(); } /** * 生成随机颜色 * * @param ll 产生颜色值下限(lower limit) * @param ul 产生颜色值上限(upper limit) * @return 生成的随机颜色对象RGB */ private static Color getRandomColor(int ll, int ul) { if (ll > 255) ll = 200; if (ul > 255) ul = 255; int r = random.nextInt(ul - ll); int g = random.nextInt(ul - ll); int b = random.nextInt(ul - ll); Color color = new Color(r, g, b); return color; } /** * 绘制干扰线 * * @param graphics Graphics2D对象,用来绘制图像 * @param nums 干扰线的条数 * @return */ public static void drawRandomLines(Graphics2D graphics, int nums) { // 设置随机干扰线条颜色 graphics.setColor(getRandomColor(160, 200)); // //产生nums 条干扰线条 for (int i = 0; i < nums; i++) { int x1 = random.nextInt(IMAGEWIDTH); int y1 = random.nextInt(IMAGEHEIGHT); int x2 = random.nextInt(12); int y2 = random.nextInt(12); graphics.drawLine(x1, y1, x2, y2); } } }
jsp代码:
<img src="/user/imageCode.htm" class="codePic" id="codePic"/> <a href="javascript:refresh()">换一组</a> function refresh(){ $("#codePic").attr("src","/user/imageCode.htm?t="+new Date()); }
注意:如果用Spring MVC框架开的话,可以利用
spring
MVC中引入captcha的插件生成图片验证码
具体查看,Spring mvc 自动生成图片验证码
相关文章推荐
- 二、JavaScript基本数据结构
- RSA算法原理(一)
- swiper.js——一般属性、进度属性
- 字符串转换为数值
- oracle12c安装时报错:[INS-30131] 执行安装程序验证所需的初始设置失败
- UIButton 不同状态图片来回切换
- lintcode 容易题:Trailing Zeros 尾部的零
- IP大时代下,网络枪机技术发展现状
- PHP图像处理之画图
- Js 日期操作
- 临时用到的文件
- 表提示 (Transact-SQL)即with(index(indexname))等
- 查询语句中时间的写法
- HTTP access control (CORS)
- activity启动模式
- 内存管理(简介,引用计数器)02
- 对Java JVM中类加载几点解释
- Android防止键盘弹出后顶起布局
- 开题答辩
- 最大公约数和最小公倍数