Java实现验证码思路

java验证码的主要思路

1.生成一个固定尾数的随机字符串

2.在内存中创建一个图片(固定高度和宽度的矩形)

3.开始绘制验证码,设置文字的字体、颜色、大小、以及一些干扰线

4.结束绘制

5.重定向写入(图片格式)

1、关于随机的字符串,我们可以预先定于一个字符串(26个英文字母加10个阿拉伯数字),然后随机生成一个[0,35]之间的数字,之后利用string.charAt()方法得到其中的一位字母,最后吧生成的字母添加到StringBuilder里。(根据情况利用for循环生成指定尾数的验证码,之后把验证码返回)

2、首先指定图片的高度和宽度(为了后期的维护和封装),之后利用BufferedImage来在内存中创建一个图片。

3、根据Graphics2D来绘制图像(矩形),设置字体、颜色、背景色及位置和大小,之后计算出文字的坐标及位置,最后将文字画入里面。

下面是代码

package cn.jiaoshou.code;

import javax.imageio.ImageIO;

import javax.servlet.http.HttpServletResponse;

import java.awt.*;

import java.awt.font.FontRenderContext;

import java.awt.geom.Rectangle2D;

import java.awt.image.BufferedImage;

import java.util.Random;

/** * 验证码工具类 */

public class CaptcahCode {

/** * 验证码生成的方法

* @param response

* @return

public static String drawImage(HttpServletResponse response) {

//1.定义一个字符串的拼接的StringBuilder StringBuilder builder=new StringBuilder();

//产生4个字符串的随机数

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

builder.append(randomChar());

String code=builder.toString();

//2.定义图片的宽度和高度 int width=100;

int height=25;

//简历bufferedImage对象,指定图片的长度和宽度以及色彩

BufferedImage bi =new BufferedImage(width,height,BufferedImage.TYPE_3BYTE_BGR); //绘制缓冲流,在内存中创建图片

//3.获取到Graphics2D绘制对象,开始绘制验证码

Graphics2D g=bi.createGraphics();

//图片绘制对象

//4.设置文字的字体、颜色、大小

Font font=new Font("微软雅黑",Font.PLAIN,20);

Color color=new Color(255,255,255);

g.setFont(font);

//设置字体

g.setColor(color);

//设置颜色

g.setBackground(new Color(0,0,0));

g.clearRect(0,0,width,height);

//干扰线的绘制,绘制线条到图片中

g.setColor(getRandomColor(180,230));

Random random = new Random();

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

int x = random.nextInt(width);

int y = random.nextInt(height);

int x1 = random.nextInt(60);

int y1 = random.nextInt(60);

g.drawLine(x,y,x1,y1);

//绘制形状,获取矩形对象

FontRenderContext context=g.getFontRenderContext();//矩形

Rectangle2D bounds=font.getStringBounds(code,context);

//计算文字的坐标和间距

double x=(width-bounds.getWidth())/2;

double y=(height-bounds.getHeight())/2;

double ascent=bounds.getY();

double basey=y-ascent;

g.drawString(code,(int)x,(int)basey);

//结束绘制

g.dispose();

try {

ImageIO.write(bi,"jpg",response.getOutputStream());

//刷新响应流

response.flushBuffer();

}catch (Exception ex){

ex.printStackTrace();

return code;

* 范围随机颜色

* @param fc

* @param bc

* @return

public static Color getRandomColor(int fc,int bc){

//利用随机数

Random random = new Random();

//随机颜色,了解颜色Color(red,green,blue).rgb三元色 0-255

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);

* 产生随机数字和字母

* @return

public static char randomChar() {

//1.定义验证需要的字母和数字