java验证码怎么实现_Java实现验证码思路

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

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值