java图片验证码(随即产生6位:数字,大写字符,小写字符)

首先我们要新建一个java类,这个类就是生成验证码的类;
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.util.Random;

import javax.imageio.ImageIO;
import javax.imageio.stream.ImageOutputStream;

public class RandomCodeUtil {

    private ByteArrayInputStream image;//图像
    private String str;//验证码
    
    private RandomCodeUtil(){
        init();
    }
    
    public static RandomCodeUtil instance(){
        return new RandomCodeUtil();
    }

    public ByteArrayInputStream getImage() {
        return image;
    }

    public String getStr() {
        return str;
    }
    
    private void init(){
        //      在内存中创建图象  
        int width=85, 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("Time News Roman",Font.ROMAN_BASELINE,17));  

        
        //      随机产生300条干扰线,使图象中的认证码不易被其它程序探测到  
        g.setColor(getRandColor(160,200));  
        for (int i=0;i<300;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<6;i++){  
            //String rand=String.valueOf(random.nextInt(10));
            String rand = getRandomChar();
            sRand = sRand.concat(rand);  
            // 将认证码显示到图象中  
            g.setColor(new Color(20+random.nextInt(110),20+random.nextInt(110),20+random.nextInt(110)));  
            //      调用函数出来的颜色相同,可能是因为种子太接近,所以只能直接生成  
            g.drawString(rand,13*i+6,16);    
        }  
        this.str=sRand;
        //       图象生效  
        g.dispose();  
        ByteArrayInputStream input=null;  
        ByteArrayOutputStream output = new ByteArrayOutputStream();  
        try{  
            ImageOutputStream imageOut = ImageIO.createImageOutputStream(output);  
            ImageIO.write(image, "JPEG", imageOut);  
            imageOut.close();  
            input = new ByteArrayInputStream(output.toByteArray());  
        }catch(Exception e){  
        System.out.println("验证码图片产生出现错误:"+e.toString());  

        }
        this.image=input;
    }
    
      
    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 static String getRandomChar() {
          int index = (int) Math.round(Math.random() * 2);
          String randChar = "";
          switch (index) {
          case 0://大写字符
           randChar = String.valueOf((char)Math.round(Math.random() * 25 + 65));
           break;
          case 1://小写字符
           randChar = String.valueOf((char)Math.round(Math.random() * 25 + 97));
           break;
          default://数字
           randChar = String.valueOf(Math.round(Math.random() * 9));
           break;
          }
          return randChar;
         }
    
}

在Action中是这样写的:


public class LoginAction extends BaseAction{

    
    private static final long serialVersionUID = 1L;
    
    
    private ByteArrayInputStream inputStream;//生成的验证码
    private String code; //用户输入的验证码
    

    
    public String doRandCode(){
        RandomCodeUtil randCode = RandomCodeUtil.instance();
        this.setInputStream(randCode.getImage());
        if(this.getSession().get("code")!=null){
            this.getSession().remove("code");
        }
        this.getSession().put("code", randCode.getStr());
        return "randCode";
    }

    public String login(){
        String mycode = ((String) this.getSession().get("code")).toLowerCase();
        String inputCode = code.toLowerCase();
        //System.out.println("session中的:"+mycode+"    ===输入的:"+inputCode);
        if(mycode.equals(inputCode)){
            this.session.remove("code");
            //验证通过
            return SUCCESS;
        }
        if(!mycode.equals(inputCode)){
            //验证未通过
            return "toLogin";
        }
    }
    

    public void setInputStream(ByteArrayInputStream inputStream) {
        this.inputStream = inputStream;
    }

    public ByteArrayInputStream getInputStream() {
        return inputStream;
    }

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }

}

struts.xml中:

<package name="adminlogin" extends="struts-default" namespace="/zb">
        <action name="login_*" method="{1}"
            class="***.LoginAction">
            <result name="randCode" type="stream">
                <param name="contentType">image/jpeg</param>  
                <param name="inputName">inputStream</param>
            </result>
        </action>
</package>     

jsp页面中是这样显示的:

<img id="validateCode" src="<c:url value="/zb/login_doRandCode"/>" οnclick="changeValidateCode()"/><span style="color:#666;font-size:12px;">看不清楚?<a href="javascript:changeValidateCode();">点击刷新</a></span>

function changeValidateCode() {  
      var timenow = new Date().getTime();//这是为了防止每次刷新的时候验证码相同
      $("#validateCode").attr("src","/zb/login_doRandCode?d="+timenow);  
    


转自: http://hi.baidu.com/ios_zb_com/item/b1aece8a7abf1fcc98255fc4
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值