博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java生成图形验证码
阅读量:6521 次
发布时间:2019-06-24

本文共 3180 字,大约阅读时间需要 10 分钟。

效果图

import java.awt.Color;import java.awt.Font;import java.awt.Graphics;import java.awt.image.BufferedImage;import java.io.IOException;import java.util.Random;import javax.imageio.ImageIO;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.HttpSession;/** * 生成图形验证码 */public class AuthImg extends HttpServlet {	private static final long serialVersionUID = 1L;	// 定义图形验证码中绘制的字符的字体	private final Font mFont = new Font("Arial Black", Font.PLAIN, 23);	// 图形验证码的大小	private final int IMG_WIDTH = 72;	private final int IMG_HEIGTH = 27;	// 获取随机颜色的方法	private Color getRandColor(int fc, int bc) {		Random random = new Random();		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);	}	// 获取随机字符串	private String getRandomChar() {		int rand = (int) Math.round(Math.random() * 2);		long itmp = 0;		char ctmp = '\u0000';		switch (rand) {		case 1:			itmp = Math.round(Math.random() * 25 + 65);			ctmp = (char) itmp;			return String.valueOf(ctmp);		case 2:			itmp = Math.round(Math.random() * 25 + 97);			ctmp = (char) itmp;			return String.valueOf(ctmp);		default:			itmp = Math.round(Math.random() * 9);			return itmp + "";		}	}	@Override	public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {		// 设置禁止缓存		response.setHeader("Pragma", "No-cache");		response.setHeader("Cache-Control", "no-cache");		response.setDateHeader("Expires", 0);		response.setContentType("image/jpeg");		BufferedImage image = new BufferedImage(IMG_WIDTH, IMG_HEIGTH, BufferedImage.TYPE_INT_RGB);		Graphics g = image.getGraphics();		Random random = new Random();		g.setColor(getRandColor(200, 250));		// 填充背景色		g.fillRect(1, 1, IMG_WIDTH - 1, IMG_HEIGTH - 1);		// 为图形验证码绘制边框		g.setColor(new Color(102, 102, 102));		g.drawRect(0, 0, IMG_WIDTH, IMG_HEIGTH);		g.setColor(getRandColor(160, 200));		// 生成随机干扰线		for (int i = 0; i < 80; i++) {			int x = random.nextInt(IMG_WIDTH - 1);			int y = random.nextInt(IMG_HEIGTH - 1);			int x1 = random.nextInt(6) + 1;			int y1 = random.nextInt(12) + 1;			g.drawLine(x, y, x + x1, y + y1);		}		g.setColor(getRandColor(160, 200));		// 生成随机干扰线		for (int i = 0; i < 80; i++) {			int x = random.nextInt(IMG_WIDTH - 1);			int y = random.nextInt(IMG_HEIGTH - 1);			int x1 = random.nextInt(12) + 1;			int y1 = random.nextInt(6) + 1;			g.drawLine(x, y, x - x1, y - y1);		}		// 设置绘制字符的字体		g.setFont(mFont);		// 用于保存系统生成的随机字符串		String sRand = "";		for (int i = 0; i < 4; i++) {			String tmp = getRandomChar();			sRand += tmp;			g.setColor(new Color(20 + random.nextInt(110), 20 + random.nextInt(110), 20 + random.nextInt(110)));			g.drawString(tmp, 15 * i + 10, 20);		}		// 获取HttpSession对象		HttpSession session = request.getSession(true);		session.removeAttribute("rand");		session.setAttribute("rand", sRand);		g.dispose();		// 向输出流中输出图片		ImageIO.write(image, "JPEG", response.getOutputStream());	}}

转载于:https://www.cnblogs.com/wjup/p/11041278.html

你可能感兴趣的文章
eclipse 设置注释模板详解,与导入模板方法介绍总结
查看>>
Cocos2d-x3.2 文字显示
查看>>
估计下星期就能考科目二了
查看>>
20 Useful Commands for Linux Newbies
查看>>
轻松实现localStorage本地存储和本地数组存储
查看>>
mongodb group
查看>>
python+selenium自动化测试(二)
查看>>
(笔记 - 纯手敲)Spring的IOC和AOP 含GIT地址
查看>>
7-设计模式介绍
查看>>
《阿里巴巴Java工作手册》学习笔记
查看>>
让运维更高效:关于ECS系统事件
查看>>
路由器和交换机的区别
查看>>
J2EE分布式框架--单点登录集成方案
查看>>
算法---反转二叉树
查看>>
Hybris ECP(Enterprise Commerce Platform)的调试
查看>>
screen命令
查看>>
跨域传递参数
查看>>
android 4.2的新特性layoutRtl,让布局自动从右往左显示
查看>>
iOS tableView 下拉列表的设计
查看>>
sharepoint 2010 属性编辑工具 SPCamlEditor 1.5.1
查看>>