java生成验证码

概述

验证码(CAPTCHA)是一种全自动程序。主要是为了区分进行操作的是不是人。一般用于注册登录验证。

 

工具类

public class VCodeUtils {
	private int w = 100;	//设置图片宽度
	private int h = 40;		//设置图片高度
	private Color bgColor = new Color(255,255,255);		//设置图片背景
	Random random = new Random();
	StringBuilder sb = new StringBuilder();
	
	private BufferedImage createImage(){
		/*
		 * 1.创建图片
		 * 2.设置背景色
		 */
		BufferedImage img = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
		//设置画笔颜色
		Graphics2D graphics2d = (Graphics2D) img.getGraphics();
		graphics2d.setColor(this.bgColor);
		graphics2d.fillRect(0, 0, w, h);
		//填充图片大小的矩形(设置背景色)
		return img;
	}
	
	private Color randomColor(){
		int r = random.nextInt(256);
		int g = random.nextInt(256);
		int b = random.nextInt(256);
		return new Color(r,g,b);
	}
	
	/**
	 * 设置 字体、字号、样式
	 * @return
	 */
	private String[] fontName = {"宋体","华文楷体","黑体","华文新魏","华文隶书","微软雅黑"};
	private int[] fontSize = {28,32,35,39,45};
	private Font randomFont(){
		int index = random.nextInt(fontName.length);
		//根据随机索引获取字体名
		String name = fontName[index];
		//设置字体样式
		int style = random.nextInt(4);
		index = random.nextInt(fontSize.length);
		//根据索引获取字体大小
		int size = fontSize[index];
		return new Font(name, style, size);
	}
	
	private String codes = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRESTUVWXYZ0123456789";
	private String randomChar(){
		int index= random.nextInt(codes.length());
		//返回随机字符
		return codes.charAt(index)+"";
	}
	
	private void drawLine (BufferedImage image) {
		int num  = 3;
		Graphics2D g2 = (Graphics2D)image.getGraphics();
		for(int i = 0; i < num; i++) {
			int x1 = random.nextInt(w);
			int y1 = random.nextInt(h);
			int x2 = random.nextInt(w);
			int y2 = random.nextInt(h); 
			g2.setStroke(new BasicStroke(1.5F)); 
			g2.setColor(Color.BLUE); 
			g2.drawLine(x1, y1, x2, y2);
		}
	}
	
	public BufferedImage getImage(){
		/**
		 * 写入字符(包括字符字体、颜色、字符种类)
		 */
		BufferedImage img = this.createImage();
		Graphics g = img.getGraphics();
		for(int i=0;i<4;i++){
			//设置字符
			String ch = this.randomChar();
			sb.append(ch);
			//设置画笔颜色
			g.setColor(this.randomColor());
			//设置画笔字体
			g.setFont(this.randomFont());
			//画出字符
			g.drawString(ch, w/4*i, h-5);
		}
		drawLine(img);
		return img;
	}
	//获取验证码的字符
	public String getText(){
		return sb.toString();
	}
	
	public static void saveImage(BufferedImage img,OutputStream out)throws Exception{
		ImageIO.write(img, "JPEG", out);
	}
	
	public static void main(String[] args) {
		try {
			VCodeUtils vc = new VCodeUtils();
			saveImage(vc.getImage(), new FileOutputStream("D:/a.jpg"));
			System.out.println(vc.getText());
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

Web实例

login.jsp

​
​
<tr>	
    <td id="tdText">验证码:</td>
    <td><input class="inputClass" type="text" name="verifyCode" id="verifyCode"/></td>
    <td class="tdError">
    <label class="errorClass" id="verifyCodeError">${errors.verifyCode}</label>
    </td>
</tr>
<tr>
    <td></td>
    <td>
        <div id="divVerifyCode"><img id="imgVerifyCode" src="UserServle?method=getVerifyCode"/></div>
    </td>
    <td>
    <label id="changeLable"><a href="javascript:_hyz()">换一张</a></label>
    </td>
</tr>

​

​

UserServlet.java

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

		VCodeUtils vc = new VCodeUtils();
		try {
			//保存图片并输出到页面
			vc.saveImage(vc.getImage(), response.getOutputStream());
			String sb = vc.getText();
			request.getSession().setAttribute("Vcode", sb);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

校验,通过比较用户输入的验证码和生成验证码是存入session的字符,并且忽略大小写。

public void verify(HttpServletRequest request, HttpServletResponse response) throws IOException{
		
		
		String input = request.getParameter("verifyCode");
		
		String vcode = (String) request.getSession().getAttribute("Vcode");
		//忽略大小写比较
		boolean flag = input.equalsIgnoreCase(vcode);
		
		response.getWriter().print(flag);
		
	}

效果图

生成验证码可以使用 Java 提供的 BufferedImage 类来创建图片,并在图片上绘制随机生成验证码。以下是一个简单Java 代码示例: ``` import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.image.BufferedImage; import java.util.Random; public class CaptchaGenerator { private static final int WIDTH = 120; // 图片宽度 private static final int HEIGHT = 40; // 图片高度 private static final int CODE_LENGTH = 4; // 验证码长度 private static final String CODE_CHARS = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; // 验证码字符集 public static BufferedImage generateCaptcha() { // 创建一个 BufferedImage 对象并设置宽度和高度 BufferedImage image = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB); // 获取 Graphics 对象以便在图片上绘制 Graphics g = image.getGraphics(); // 设置背景颜色 g.setColor(Color.WHITE); g.fillRect(0, 0, WIDTH, HEIGHT); // 绘制验证码 Random random = new Random(); StringBuilder code = new StringBuilder(); for (int i = 0; i < CODE_LENGTH; i++) { int index = random.nextInt(CODE_CHARS.length()); char c = CODE_CHARS.charAt(index); code.append(c); g.setColor(new Color(random.nextInt(256), random.nextInt(256), random.nextInt(256))); g.setFont(new Font("Arial", Font.BOLD, 24)); g.drawString(String.valueOf(c), i * 30 + 10, 30); } // 添加噪声点 for (int i = 0; i < 50; i++) { int x = random.nextInt(WIDTH); int y = random.nextInt(HEIGHT); g.setColor(new Color(random.nextInt(256), random.nextInt(256), random.nextInt(256))); g.fillOval(x, y, 2, 2); } // 添加噪声线 for (int i = 0; i < 3; i++) { int x1 = random.nextInt(WIDTH); int y1 = random.nextInt(HEIGHT); int x2 = random.nextInt(WIDTH); int y2 = random.nextInt(HEIGHT); g.setColor(new Color(random.nextInt(256), random.nextInt(256), random.nextInt(256))); g.drawLine(x1, y1, x2, y2); } // 释放 Graphics 对象 g.dispose(); return image; } } ``` 该代码会生成一个宽度为 120、高度为 40 的验证码图片。验证码由 4 个随机字符组成,字符集包括大小写字母和数字。在图片上会添加一些噪声点和噪声线以增加验证码的复杂度。可以调整字符集、验证码长度、噪声点数量和噪声线数量等参数以满足需求。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值