java 验证码生成,java验证码生成具体代码

本文实例为大家分享了java验证码生成的示例代码,供大家参考,具体内容如下

package com.gonvan.component.captcha;

import java.awt.*;

import java.awt.image.BufferedImage;

import java.io.IOException;

import java.util.HashMap;

import java.util.Map;

import java.util.Random;

import javax.imageio.ImageIO;

import javax.servlet.ServletOutputStream;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import javax.servlet.http.HttpSession;

/**

* Created by yuerzm on 2016/3/14.

*/

public class CaptchaFactory {

private static final char[] CODE_SEQUENCE = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"

.toCharArray();

private static final int DEFAULT_WIDTH = 60;

private static final int DEFAULT_HEIGHT = 20;

private static final int DEFAULT_CODE_LEN = 4;

private static final int DEFAULT_CODE_X = 13;

private static final int DEFAULT_CODE_Y = 16;

private static final int DEFAULT_FONT_SIZE = 18;

private static final String DEFAULT_FONT_FAMILY = "Times New Roman";

private static CaptchaFactory instance = new CaptchaFactory();

private int width = DEFAULT_WIDTH; // 定义图片的width

private int height = DEFAULT_HEIGHT; // 定义图片的height

private int length = DEFAULT_CODE_LEN; // 定义图片上显示验证码的个数

private int xx = DEFAULT_CODE_X; // 定义图片上显示验证码x坐标

private int yy = DEFAULT_CODE_Y; // 定义图片上显示验证码y坐标

private int fontSize = DEFAULT_FONT_SIZE; // 定义图片上显示验证码的字体大小

private String fontFamily = DEFAULT_FONT_FAMILY; // 定义图片上显示验证码的个数

private CaptchaFactory() {

}

public static CaptchaFactory getInstance() {

return instance;

}

/**

* 配置宽高

*

* @param w

* @param h

* @return

*/

public CaptchaFactory configWidthAndHeight(int w, int h) {

instance.width = w;

instance.height = h;

return instance;

}

/**

* 配置坐标

*

* @param x

* @param y

* @return

*/

public CaptchaFactory configXY(int x, int y) {

instance.xx = x;

instance.yy = y;

return instance;

}

/**

* 配置字体大小

*

* @param fontSize

* @return

*/

public CaptchaFactory configFontSize(int fontSize) {

instance.fontSize = fontSize;

return instance;

}

/**

* 配置字体

*

* @param fontFamily

* @return

*/

public CaptchaFactory configFontSize(String fontFamily) {

instance.fontFamily = fontFamily;

return instance;

}

public void write(HttpServletRequest request, HttpServletResponse response) throws IOException {

// 将四位数字的验证码保存到Session中。

Map captcha = generate();

String randomCode = (String) captcha.get("captchaCode");

BufferedImage buffImg = (BufferedImage) captcha.get("captchaImg");

HttpSession session = request.getSession();

session.setAttribute("code", randomCode);

// 禁止图像缓存。

response.setHeader("Pragma", "no-cache");

response.setHeader("Cache-Control", "no-cache");

response.setDateHeader("Expires", 0);

response.setContentType("image/jpeg");

// 将图像输出到Servlet输出流中。

ServletOutputStream outputStream = response.getOutputStream();

ImageIO.write(buffImg, "jpeg", outputStream);

outputStream.close();

}

public Map generate() throws IOException {

// 定义图像buffer

BufferedImage buffImg = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);

Graphics gd = buffImg.getGraphics();

// 设定背景色

gd.setColor(getRandColor(200, 250));

gd.fillRect(0, 0, width, height);

// 设定字体,字体的大小应该根据图片的高度来定。

gd.setFont(new Font(fontFamily, Font.PLAIN, fontSize));

// 创建一个随机数生成器类

Random random = new Random();

// 随机产生40条干扰线,使图象中的认证码不易被其它程序探测到。

gd.setColor(getRandColor(160, 200));

for (int i = 0; i < 155; i++) {

int x = random.nextInt(width);

int y = random.nextInt(height);

int xl = random.nextInt(12);

int yl = random.nextInt(12);

gd.drawLine(x, y, x + xl, y + yl);

}

// randomCode用于保存随机产生的验证码,以便用户登录后进行验证。

StringBuffer randomCode = new StringBuffer();

int red = 0, green = 0, blue = 0;

// 随机产生 length 个验证码。

for (int i = 0; i < length; i++) {

// 得到随机产生的验证码数字。

String code = String.valueOf(CODE_SEQUENCE[random.nextInt(36)]);

// 产生随机的颜色分量来构造颜色值,这样输出的每位数字的颜色值都将不同。

red = random.nextInt(110);

green = random.nextInt(110);

blue = random.nextInt(110);

// 用随机产生的颜色将验证码绘制到图像中。

gd.setColor(new Color(red + 20, green + 20, blue + 20));

gd.drawString(code, i * xx + 6, yy);

// 将产生的随机数组合在一起。

randomCode.append(code);

}

Map retval = new HashMap<>();

retval.put("captchaCode", randomCode.toString());

retval.put("captchaImg", buffImg);

return retval;

}

/**

* 给定范围获得随机颜色

*

* @param fc

* 最小值

* @param bc

* 最大值

* @return Color

*/

private Color getRandColor(int fc, int bc) {

Random random = new Random();

if (fc > 255)

fc = 255;

if (bc > 255)

bc = 255;

int r = fc + random.nextInt(bc - fc);

int g = fc + random.nextInt(bc - fc);

int b = fc + random.nextInt(bc - fc);

return new Color(r, g, b);

}

}

以上就是本文的全部内容,希望对大家的学习有所帮助。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值