Java工具类-图片验证码
1. 创建接收实体类
这个实体类是可以更变的,具体的实体类可以根据自己的业务需求去编写,这里使用的是一个比较通用一点的实体类来接收,也可以不使用实体类接收,直接使用,不过在日常开发中,不建议这样去做
- 创建实体,并生成他的 Get 和 Set 方法,有参数构造和无参数构造
public class VerifyCode {
private String code; // 验证码文字信息
private BufferedImage imgs; // 图片验证码信息
}
2. 验证码工具类
import java.awt.*;
import java.awt.image.BufferedImage;
import java.util.Random;
/**
* 获取验证码
*/
public class VerifyCodeUtils {
private int height = 30; // 图片宽
private int width = 80; // 图片高
private int codeNumber = 4; // 生成的验证码个数
// 定义有哪些字符验证码
private String codeString = "23456789abcdefghjkmnopqrstuvwxyzABCDEFGHJKLMNOPQRSTUVWXYZ";
// 定义背景颜色
private Color backgroundColor = new Color(255, 255, 255);
// 定义字体
private String[] fontNames = { "宋体", "华文楷体", "黑体", "微软雅黑", "楷体_GB2312"};
// 获取一个验证码,用来生成图片
public String getCodeText(){
StringBuffer codeText = new StringBuffer();
for (int i = 0; i < codeNumber; i++) {
int randomNumber = getRandomNumber(1,codeString.length());
codeText.append(codeString.charAt(randomNumber));
}
return codeText.toString();
}
// 获取一个随机数字,用来取得codeString中的随机一个字母
public int getRandomNumber(int start,int end){
int randomNumber = (int) (Math.random() * (end-start)+start);
return randomNumber;
}
// 生成一个随机颜色
public Color getRandomColor(){
int r = getRandomNumber(1,255);
int g = getRandomNumber(1,255);
int b = getRandomNumber(1,255);
Color color = new Color(r,g,b);
return color;
}
// 生成一个随机字体
public Font getRandomFont(){
// 字体 如黑体
String fontStyle = fontNames[getRandomNumber(0,fontNames.length)];
// 字体加粗斜体 Font.BOLD = 1 Font.ITALIC = 2 Font.BOLD + Font.ITALIC = 3
int fontBlod = getRandomNumber(1,4);
// 定义字体大小
int size = getRandomNumber(24,30);
// System.out.println("字体:" + fontStyle + " 加粗:" + fontBlod + " 字体大小:" + size);
Font font = new Font(fontStyle,fontBlod,size);
return font;
}
// 获取图片验证码
public VerifyCode getCodeImge(){
// 创建一个验证码的实体
VerifyCode verifyCode = new VerifyCode();
// 创建画板 不带透明色的画板
BufferedImage bufferedImage = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
// 获取此画板的画笔
Graphics graphics = bufferedImage.getGraphics();
// 设置画笔的颜色
graphics.setColor(backgroundColor);
// 填充画板背景颜色
graphics.fillRect(0,0,width,height);
// 获取随机验证码文字
String codeText = getCodeText();
// 在画板上画出验证码
for (int i = 0; i < codeNumber; i++) {
// 给画笔设置一个随机颜色
graphics.setColor(getRandomColor());
// 设置一个随机颜色
graphics.setFont(getRandomFont());
// 设置验证码的X坐标 当前是第几个字符转为float 乘以画板大小,除以验证码个数等于平均每个验证码的位置
float x = i*1.0f*width/codeNumber;
int y = height - getRandomNumber(8,height-(8*2));
// 将验证码逐个写到图片上
graphics.drawString(codeText.charAt(i)+"", (int) x,y);
}
// 在实体中添加验证码的信息
verifyCode.setCode(codeText);
verifyCode.setImgs(bufferedImage);
return verifyCode;
}
}
3. 使用验证码工具类
- 这个代码是JavaServlet中的一个请求,是最基础的web请求和响应方式,在使用中可以根据自己的实际使用场景去使用,这里只做了一个大概的演示
/**
* 获取验证码
*/
// 注解servlet注册
@WebServlet("/getVerify")
public class VerifyCodeServlet extends ServletUtils {
// 这里的servlet Utils和继承HttpServlet中的doGet和doPost方法一致
public void getVerify(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 创建工具类对象
VerifyCodeUtils verifyCodeUtils = new VerifyCodeUtils();
// 获取验证码,返回实体对象
VerifyCode codeImge = verifyCodeUtils.getCodeImge();
// 查询验证码是什么
System.out.println("验证码:" + codeImge.getCode());
// 在session域中放入验证码
req.getSession().setAttribute("registerVerifyCode",codeImge.getCode());
// 将图片写到页面上
ImageIO.write(codeImge.getImgs(),"png",resp.getOutputStream());
}
}
评论区(暂无评论)