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());
    	}
    
    }
    
  • 相关阅读:
    重新整理 .net core 实践篇————防跨站脚本攻击[四十]
    重新整理 .net core 实践篇————重定向攻击[三十九]
    低数值精度推理和训练
    FinFET与芯片制程
    LLVM Backend技术
    安霸Ambarella CV系列芯片
    3D卷积,代码实现
    TVM darknet yolov3算子优化与量化代码的配置方法
    英特尔 QLC 3D NAND 数据存储
    Graph Representation 图神经网络
  • 原文地址:https://www.cnblogs.com/wjup/p/11041278.html
Copyright © 2011-2022 走看看