zoukankan      html  css  js  c++  java
  • java生成图形验证码

    效果图

    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());
    	}
    
    }
    
  • 相关阅读:
    webpack基础
    LeetCode232. 用栈实现队列做题笔记
    mysql 时间加减一个月
    leetcode 1381. 设计一个支持增量操作的栈 思路与算法
    LeetCode 141. 环形链表 做题笔记
    leetcode 707. 设计链表 做题笔记
    leetcode 876. 链表的中间结点 做题笔记
    leetcode 143. 重排链表 做题笔记
    leetcode 1365. 有多少小于当前数字的数字 做题笔记
    LeetCode1360. 日期之间隔几天 做题笔记
  • 原文地址:https://www.cnblogs.com/wjup/p/11041278.html
Copyright © 2011-2022 走看看