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

    1. 前端jsp
    <img id="imgCaptcha" src="${contextPath}/CaptchaServlet" class="code" onclick="javascript:refresh(this);" />
    

    2.点击图片刷新

    function refresh(obj) {
    	console.log(obj);
        obj.src = "<%=basePath%>/CaptchaServlet?"+Math.random();  
    }
    

    3.servlet实现

    import java.io.IOException;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    public class captchaServlet extends HttpServlet{
    	
    	@Override
    	public void doGet(HttpServletRequest request, HttpServletResponse response)  
                throws ServletException, IOException {  
            response.setContentType("image/jpeg");//设置相应类型,告诉浏览器输出的内容为图片  
            response.setHeader("Pragma", "No-cache");//设置响应头信息,告诉浏览器不要缓存此内容  
            response.setHeader("Cache-Control", "no-cache");  
            response.setDateHeader("Expire", 0);  
            RandomValidateCode randomValidateCode = new RandomValidateCode();  
            try {  
                randomValidateCode.getRandcode(request, response);//输出图片方法  
            } catch (Exception e) {  
                e.printStackTrace();  
            }  
        }  
    	@Override
    	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
         doGet(req, resp);
    		super.doPost(req, resp);
    	}
    }
    
    
    

    RandomValidateCode绘制类

    import java.awt.Color;
    import java.awt.Font;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.image.BufferedImage;
    import java.util.Random;
    
    import javax.imageio.ImageIO;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpSession;
    
    import org.springframework.ui.Model;
    
    public class RandomValidateCode {
    	public static final String RANDOMCODEKEY = "RANDOMVALIDATECODEKEY";// 放到session中的key  
        private Random random = new Random();  
        // 随机产生数字与字母组合的字符串  
        private String randString = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";  
        /* 
         * private String randString = "0123456789";//随机产生只有数字的字符串 private String 
         * randString = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";//随机产生只有字母的字符串 
         */  
        private int width = 150;// 图片宽  
        private int height = 45;// 图片高  
        private int lineSize = 80;// 干扰线数量  
        private int stringNum = 4;// 随机产生字符数量  
      
        /* 
         * 获得字体 
         */  
        private Font getFont() {  
            return new Font("Fixedsys", Font.CENTER_BASELINE,38);  
        }  
      
        /* 
         * 获得颜色 
         */  
        private Color getRandColor(int fc, int bc) {  
            if (fc > 255)  
                fc = 255;  
            if (bc > 255)  
                bc = 255;  
            int r = fc + random.nextInt(bc - fc - 16);  
            int g = fc + random.nextInt(bc - fc - 14);  
            int b = fc + random.nextInt(bc - fc - 18);  
            return new Color(r, g, b);  
        }  
      
        /** 
         * 生成随机图片 
         */  
        public void getRandcode(HttpServletRequest request,  
                HttpServletResponse response) {  
            HttpSession session = request.getSession();  
            // BufferedImage类是具有缓冲区的Image类,Image类是用于描述图像信息的类  
            BufferedImage image = new BufferedImage(width, height,  
                    BufferedImage.TYPE_INT_RGB);  
            Graphics g = image.getGraphics();// 产生Image对象的Graphics对象,改对象可以在图像上进行各种绘制操作  
            Graphics2D g2=(Graphics2D)g;
            g2.setBackground(new Color(19, 124, 189));
            g2.fillRect(0, 0, width, height);  
            g2.setFont(new Font("Times New Roman", Font.ROMAN_BASELINE, 28));  
            g2.setColor(getRandColor(110, 133));  
            
            // 绘制干扰线  
            for (int i = 0; i <= lineSize; i++) {  
                drowLine(g2);  
            }  
            // 绘制随机字符  
            String randomString = "";  
            for (int i = 1; i <= stringNum; i++) {  
                randomString = drowString(g2, randomString, i);  
            }  
            //将生成的随机字符串保存到session中,而jsp界面通过session.getAttribute("RANDOMCODEKEY"),  
            //获得生成的验证码,然后跟用户输入的进行比较  
            session.removeAttribute("RANDOMCODEKEY");  
            session.setAttribute("RANDOMCODEKEY", randomString); 
            g2.dispose();  
            try {  
                // 将内存中的图片通过流动形式输出到客户端  
                ImageIO.write(image, "JPEG", response.getOutputStream());  
            } catch (Exception e) {  
                e.printStackTrace();  
            }  
      
        }  
      
        /* 
         * 绘制字符串 
         */  
        private String drowString(Graphics g, String randomString, int i) {  
            g.setFont(getFont());  
            g.setColor(new Color(random.nextInt(101), random.nextInt(111), random  
                    .nextInt(121)));  
            String rand = String.valueOf(getRandomString(random.nextInt(randString  
                    .length())));  
            randomString += rand;  
            if(i==1){
            	g.translate(random.nextInt(3), 10);  
            }else{
            	g.translate(random.nextInt(3), random.nextInt(3)); 
            }
            
            g.drawString(rand, 23 * i, 26);  
            return randomString;  
        }  
      
        /* 
         * 绘制干扰线 
         */  
        private void drowLine(Graphics g) {  
            int x = random.nextInt(width);  
            int y = random.nextInt(height);  
            int xl = random.nextInt(13);  
            int yl = random.nextInt(15);  
            g.drawLine(x, y, x + xl, y + yl);  
        }  
      
        /* 
         * 获取随机的字符 
         */  
        public String getRandomString(int num) {  
            return String.valueOf(randString.charAt(num));  
        }  
    }
    
  • 相关阅读:
    【内核】linux内核启动流程详细分析【转】
    【Linux】Linux基本命令扫盲【转】
    【Linux高级驱动】linux设备驱动模型之平台设备驱动机制【转】
    【Git】Git与GitHub 入门【转】
    usbnet驱动深入分析-usb虚拟网卡host端【转】
    USB设备被识别流程【转】
    LinuxUSB驱动程序调试--009:编写应用程序---验证协议【转】
    公积金条例久拖不改是谁在博弈?
    Android事件机制全然解析
    《Java并发编程实战》第二章 线程安全性 读书笔记
  • 原文地址:https://www.cnblogs.com/yonyong/p/11299007.html
Copyright © 2011-2022 走看看