您的位置:首页 > 编程语言 > Java开发

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中
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  jsva 验证码