zoukankan      html  css  js  c++  java
  • JAVA生成问答式验证码图片,支持加减算法

    原文:http://liuguihua0823.iteye.com/blog/1511355

    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.servlet.http.HttpServletRequest;
    
    import org.apache.struts2.convention.annotation.Action;
    import org.apache.struts2.convention.annotation.InterceptorRefs;
    import org.apache.struts2.convention.annotation.ParentPackage;
    
    import com.rd.p2p.additional.redisCaptcha.util.ResponseUtil;
    
    @ParentPackage("p2p-api")
    @InterceptorRefs({ @org.apache.struts2.convention.annotation.InterceptorRef("commonCheck") })
    public class TestAction extends AppBaseAction {
        
        
        
        @Action("/app/test2")
        public void test() throws IOException{
            try {  
                int width = 140, height = 37;  
                String baseStr = generateCheckCode(request);  
          
                BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);  
                Graphics g = image.getGraphics();  
          
                Random random = new Random();  
          
                g.setColor(getRandColor(random, 200, 250));  
                g.fillRect(0, 0, width, height);  
          
                String[] fontTypes = { "u5b8bu4f53", "u65b0u5b8bu4f53", "u9ed1u4f53", "u6977u4f53", "u96b6u4e66" };  
                int fontTypesLength = fontTypes.length;  
          
                g.setColor(getRandColor(random, 160, 200));  
                g.setFont(new Font("Times New Roman", Font.PLAIN, 14 + random.nextInt(6)));  
                  
                for (int i = 0; i < 255; i++) {  
                    int x = random.nextInt(width);  
                    int y = random.nextInt(height);  
                    int xl = random.nextInt(12);  
                    int yl = random.nextInt(12);  
                    g.drawLine(x, y, x + xl, y + yl);  
                }  
                  
                String [] baseChar = baseStr.split(" ");  
                for (int i = 0; i < baseChar.length; i++) {  
                    g.setColor(getRandColor(random, 30, 150));  
                    g.setFont(new Font(fontTypes[random.nextInt(fontTypesLength)], Font.BOLD, 22 + random.nextInt(6)));  
                    g.drawString(baseChar[i], 24 * i + 10, 24);  
                }  
                  
                g.dispose();  
          
                //发送图片
                ResponseUtil.sendImg(response, image, "image/jpeg", "code", "jpg");
            } catch (IllegalStateException e) {  
                System.out.println(e.getMessage());  
                e.printStackTrace();  
            }  
            
        }
        
        private static Color getRandColor(Random random, int fc, int bc){  
            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 static String generateCheckCode(HttpServletRequest request) {  
            Random random = new Random();  
            int intTemp;  
            int intFirst = random.nextInt(100);  
            int intSec = random.nextInt(100);  
            String checkCode = "";  
            int result = 0;  
            switch (random.nextInt(6)) {  
                case 0:  
                    if (intFirst < intSec) {  
                        intTemp = intFirst;  
                        intFirst = intSec;  
                        intSec = intTemp;  
                    }  
                    checkCode = intFirst + " - " + intSec + " = ?";  
                    result = intFirst-intSec;  
                    break;  
                case 1:  
                    if (intFirst < intSec) {  
                        intTemp = intFirst;  
                        intFirst = intSec;  
                        intSec = intTemp;  
                    }  
                    checkCode = intFirst + " - ? = "+(intFirst-intSec);  
                    result = intSec;  
                    break;  
                case 2:  
                    if (intFirst < intSec) {  
                        intTemp = intFirst;  
                        intFirst = intSec;  
                        intSec = intTemp;  
                    }  
                    checkCode = "? - "+intSec+" = "+(intFirst-intSec);  
                    result = intFirst;  
                    break;  
                case 3:  
                    checkCode = intFirst + " + " + intSec + " = ?";  
                    result = intFirst + intSec;  
                    break;  
                case 4:  
                    checkCode = intFirst + " + ? ="+(intFirst+intSec);  
                    result = intSec;  
                    break;  
                case 5:  
                    checkCode = "? + " + intSec + " ="+(intFirst+intSec);  
                    result = intFirst;  
                    break;  
            }  
            System.out.println("result=" + result);
            request.getSession().setAttribute("VERIFY_CODE", result);  
            return checkCode;  
        }  
        
    }
  • 相关阅读:
    Mutex 的正确打开方式
    常用 CMD 命令
    【LeetCode】在排序数组中查找元素的第一个和最后一个位置【三次二分】
    【LeetCode】搜索旋转排序数组【两次二分】
    【手写代码】计算1-n中总共有多少二进制1
    【手写代码】快速计算数字x有多少个二进制1
    【手写代码】建立二叉搜索树
    【LeetCode】下一个排列【找规律】
    【LeetCode】删除排序数组中的重复项&&移除特定元素【双指针,原地算法】
    【LeetCode】删除链表的倒数第N个节点【双指针法】
  • 原文地址:https://www.cnblogs.com/shihaiming/p/7662356.html
Copyright © 2011-2022 走看看