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

    页面:

    验证码: <input type='text' value='' name='captcha'/>
    <img src="captcha"  alt="看不清楚?请点击刷新" id="captchaImg" style="57px;height:20px;position:relative;left:3px;top:5px" onclick="this.src=this.src+'?'+Math.random();"/>

    action 

    import java.awt.Color;
    import java.awt.Font;
    import java.awt.Graphics;
    import java.awt.image.BufferedImage;
    import java.io.ByteArrayInputStream;
    import java.io.ByteArrayOutputStream;
    import java.io.IOException;
    import java.util.Random;
    
    import javax.imageio.ImageIO;
    import javax.imageio.stream.ImageOutputStream;
    
    import org.springframework.context.annotation.Scope;
    import org.springframework.stereotype.Component;
    
    import com.opensymphony.xwork2.Action;
    import com.opensymphony.xwork2.ActionContext;
    import com.yuhong.see.util.Constant;
    
    @Component
    @Scope("prototype")
    public class CaptchaAction extends BaseAction {
    
        /**
         * @author JemiYao
         */
        private static final long serialVersionUID = 4103890175141691958L;
    
        // 输出流
        private ByteArrayInputStream pic;
    
        // 生成验证图片
        public String execute() {
    
            int width = 57, height = 20;
    
            BufferedImage image = new BufferedImage(width, height,
                    BufferedImage.TYPE_INT_RGB);
    
            Graphics g = image.getGraphics();
    
            Random random = new Random();
    
            // 设定背景色
            g.setColor(getRandColor(200, 250));
            g.fillRect(0, 0, width, height);
    
            // 设定字体
            g.setFont(new Font("Times New Roman", Font.PLAIN, 18));
    
            // 随机产生155条干扰线,使图象中的认证码不易被其它程序探测到
            g.setColor(getRandColor(160, 200));
            for (int i = 0; i < 155; 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);
            }
    
            // 取随机产生的认证码(6位数字)
            String sRand = "";
            for (int i = 0; i < 4; i++) {
                String rand = String.valueOf(random.nextInt(10));
                sRand += rand;
                // 将认证码显示到图象中
                g.setColor(new Color(20 + random.nextInt(110), 20 + random
                        .nextInt(110), 20 + random.nextInt(110)));
                // 调用函数出来的颜色相同,可能是因为种子太接近,所以只能直接生成
                g.drawString(rand, 13 * i + 6, 16);
            }
    
            // 将认证码存入SESSION
            ActionContext.getContext().getSession()
                    .put(Constant.SESSION_CAPTCHA_KEY, sRand);
    
            // 图象生效
            g.dispose();
            ByteArrayOutputStream output = new ByteArrayOutputStream();
            ImageOutputStream imageOut;
            try {
                imageOut = ImageIO.createImageOutputStream(output);
                ImageIO.write(image, "JPEG", imageOut);
                imageOut.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
    
            ByteArrayInputStream input = new ByteArrayInputStream(
                    output.toByteArray());
            this.setPic(input);
    
            return Action.SUCCESS;
        }
    
        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);
        }
    
        public ByteArrayInputStream getPic() {
            return pic;
        }
    
        public void setPic(ByteArrayInputStream pic) {
            this.pic = pic;
        }
    
    }

    struts

    <action name="captcha" class="captchaAction">
                <result type="stream">
                    <param name="contentType">image/jpeg</param>
                    <param name="inputName">pic</param>
                </result>
            </action>
  • 相关阅读:
    WPF TreeView IsExpanded 绑定不上的问题
    WPF TreeView BringIntoViewBehavior
    WPF ListBox的进阶使用(二)
    WPF ListBox的进阶使用(一)
    双缓冲队列解决WPF界面卡死
    C# 对接Https接口
    软件架构的六大设计原则
    FeignClient接口封装
    CentOS修改root密码
    并发编程的挑战(Java并发编程的艺术)
  • 原文地址:https://www.cnblogs.com/zhangchenglzhao/p/3184176.html
Copyright © 2011-2022 走看看