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.定义验证需要的字母和数字
String string="qwertyuioplkjhgfdsazxcvbnm1234567890";
//2.定义随机对象 Random random=new Random();
return string.charAt(random.nextInt(string.length()));
}
}
总结:在实战的过程中,运行的的时候图片一直出现错误,之后找了很多原因都没发现错误。知道半个小时候才发现,在写入的时候把图片格式写成了jsp而不是jpg。(一个大写的妈卖批)
网友评论