`

转:使用java生成数字验证码

    博客分类:
  • Java
阅读更多

原文转载自:http://747017186.iteye.com/blog/2275867

 

转载内容:

1、验证码生成的基础类

package com.hljw.health.plat.action.portalpage;
import java.awt.Color;  
import java.awt.Graphics2D;  
import java.awt.geom.AffineTransform;  
import java.util.Random;  
  
/** 
 * 验证码图片生成器 
 *  
 * @author huangjunhua 
 *  
 */  
public class IdentifyingCode {  
    /** 
     * 验证码图片的宽度。 
     */  
    private int width = 80;  
    /** 
     * 验证码图片的高度。 
     */  
    private int height = 40;  
    /** 
     * 验证码的数量。 
     */  
    private Random random = new Random();  
      
    public IdentifyingCode(){}  
    /** 
     * 生成随机颜色 
     * @param fc    前景色 
     * @param bc    背景色 
     * @return  Color对象,此Color对象是RGB形式的。 
     */  
    public Color getRandomColor(int fc, int bc) {  
        if (fc > 255)  
            fc = 200;  
        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);  
    }  
      
    /** 
     * 绘制干扰线 
     * @param g Graphics2D对象,用来绘制图像 
     * @param nums  干扰线的条数 
     */  
    public void drawRandomLines(Graphics2D g ,int nums ){  
        g.setColor(this.getRandomColor(160, 200)) ;  
        for(int i=0 ; i<nums ; i++){  
            int x1 = random.nextInt(width) ;  
            int y1 = random.nextInt(height);  
            int x2 = random.nextInt(12) ;  
            int y2 = random.nextInt(12) ;  
            g.drawLine(x1, y1, x2, y2) ;  
        }  
    }  
      
    /** 
     * 获取随机字符串, 
     *      此函数可以产生由大小写字母,汉字,数字组成的字符串 
     * @param length    随机字符串的长度 
     * @return  随机字符串 
     */  
    public String drawRandomString(int length , Graphics2D g){  
        StringBuffer strbuf = new StringBuffer() ;  
        String temp = "" ;  
        int itmp = 0 ;  
        for(int i=0 ; i<length ; i++){  
            switch(random.nextInt(5)){  
            case 1:     //生成A~Z的字母  
                itmp = random.nextInt(26) + 65 ;  
                temp = String.valueOf((char)itmp);  
                break;  
            case 2:    //生成数字
                itmp = random.nextInt(26) + 97 ;  
                temp = String.valueOf((char)itmp);  
//            case 3:     //生成汉字  
//                String[] rBase = {"0" , "1" , "2" , "3" , "4" , "5" , "6" , "7" ,   
//                        "8" , "9" , "a" , "b" , "c" , "d" , "e" , "f" };  
//                int r1 = random.nextInt(3)+11 ;     //生成第1位的区码  
//                String strR1 = rBase[r1] ;      //生成11~14的随机数  
//                int r2 ;        //生成第2位的区码  
//                if(r1 == 13)  
//                    r2 = random.nextInt(7) ;    //生成0~7的随机数  
//                else  
//                    r2 = random.nextInt(16) ;   //生成0~16的随机数  
//                String strR2 = rBase[r2] ;  
//                int r3 = random.nextInt(6) + 10 ;   //生成第1位的位码  
//                String strR3 = rBase[r3] ;  
//                int r4 ;        //生成第2位的位码  
//                if(r3 == 10)  
//                    r4 = random.nextInt(15) + 1;    //生成1~16的随机数  
//                else if(r3 == 15)  
//                    r4 = random.nextInt(15) ;       //生成0~15的随机数  
//                else  
//                    r4 = random.nextInt(16) ;       //生成0~16的随机数  
//                String strR4 = rBase[r4] ;  
//                //将生成的机内码转换成数字  
//                byte[] bytes = new byte[2]   ;        
//                String strR12 = strR1 + strR2 ;     //将生成的区码保存到字节数组的第1个元素中  
//                int tempLow = Integer.parseInt(strR12, 16) ;  
//                bytes[0] = (byte)tempLow;  
//                String strR34 = strR3 + strR4 ;     //将生成的区码保存到字节数组的第2个元素中  
//                int tempHigh = Integer.parseInt(strR34, 16) ;  
//                bytes[1] = (byte)tempHigh;  
//                temp = new String(bytes);           //根据字节数组生成汉字  
//                break;  
            default:  
                itmp = random.nextInt(10) + 48 ;  
                temp = String.valueOf((char)itmp) ;  
                break;  
            }  
            Color color = new Color(20+random.nextInt(20) , 20+random.nextInt(20) ,20+random.nextInt(20) );  
            g.setColor(color) ;  
            //想文字旋转一定的角度  
            AffineTransform trans = new AffineTransform();  
            trans.rotate(random.nextInt(45)*3.14/180, 15*i+8, 7) ;  
            //缩放文字  
            float scaleSize = random.nextFloat() + 0.8f ;  
            if(scaleSize>1f)  
                scaleSize = 1f ;  
            trans.scale(scaleSize, scaleSize) ;  
            g.setTransform(trans) ;  
            g.drawString(temp, 15*i+18, 30) ;//字体出现的坐标  
              
            strbuf.append(temp) ;  
        }  
        g.dispose() ;  
        return strbuf.toString() ;  
    }  
    public int getWidth() {  
        return width;  
    }  
    public void setWidth(int width) {  
        this.width = width;  
    }  
    public int getHeight() {  
        return height;  
    }  
    public void setHeight(int height) {  
        this.height = height;  
    }  
}     

2、 专门负责在页面请求生成验证码图片的servlet

package com.hljw.health.plat.action.portalpage;
import java.awt.Font;  
import java.awt.Graphics2D;  
import java.awt.image.BufferedImage;  
import java.io.IOException;  
  
import javax.imageio.ImageIO;  
import javax.servlet.ServletException;  
import javax.servlet.http.HttpServlet;  
import javax.servlet.http.HttpServletRequest;  
import javax.servlet.http.HttpServletResponse;  
  
@SuppressWarnings("serial")  
public class PictureCheckCode extends HttpServlet {  
      
    public PictureCheckCode() {  
        super();  
    }  
      
    public void init() throws ServletException {  
        super.init() ;  
    }  
    public void destroy() {  
        super.destroy();   
    }  
  
    public void doGet(HttpServletRequest request, HttpServletResponse response)  
            throws ServletException, IOException {  
        doPost(request, response) ;  
  
    }  
  
    public void doPost(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") ;  
        IdentifyingCode idCode = new IdentifyingCode();  
        BufferedImage image =new BufferedImage(idCode.getWidth() , idCode.getHeight() , BufferedImage.TYPE_INT_BGR) ;  
        Graphics2D g = image.createGraphics() ;  
        //定义字体样式  
        Font myFont = new Font("黑体" , Font.BOLD , 25) ;  
        //设置字体  
        g.setFont(myFont) ;  
          
        g.setColor(idCode.getRandomColor(200 , 250)) ;  
        //绘制背景  
        g.fillRect(0, 0, idCode.getWidth() , idCode.getHeight()) ;  
          
        g.setColor(idCode.getRandomColor(180, 200)) ;  
        idCode.drawRandomLines(g, 160) ;  
        String verifyCode=idCode.drawRandomString(4, g) ;  
        System.out.println("**************"+verifyCode);
        request.getSession().setAttribute("verifyCode", verifyCode);//把验证码保存到session当中
        g.dispose() ;  
        ImageIO.write(image, "JPEG", response.getOutputStream()) ;  
    }  
}  

3、web.xml文件的配置

<!-- 图像验证码的servlet -->
<servlet>  
	<servlet-name>PictureCheckCode</servlet-name>  
	<servlet-class>com.hljw.health.plat.action.portalpage.PictureCheckCode</servlet-class>  
</servlet>  
<servlet-mapping>  
	<servlet-name>PictureCheckCode</servlet-name>  
	<url-pattern>/PictureCheckCode.action</url-pattern>  
</servlet-mapping>

4、JSP页面请求

页面结构:

<input type="text"  name="identifyingCode" id="identifyingCode"/>
<img width="80" height="40" border="0"  id="JS_captcha" onclick="reflushVerify();"/> 

JS:

$(function(){	
	reflushVerify();//加载验证码
});

//刷新验证码
function reflushVerify(){
	var imgsrc="PictureCheckCode?random="+Math.random();//验证码加上随机刷新可以得到不同的验证码,如果不加则验证码不会变化,这一点非常重要,实现局部刷新
	$("#JS_captcha").attr("src",imgsrc);
}
分享到:
评论

相关推荐

    java生成图片验证码

    首先,我们来看标题"java生成图片验证码"。这个标题暗示我们将探讨的是在Java环境中生成随机的、可读性较差的文本,并将其转化为图像的过程,以创建一个验证码。验证码通常由字母、数字或两者混合组成,设计的目的...

    Java生成算数运算中文图片验证码

    Java生成算数运算中文图片验证码的实现,结合了编程语言、图像处理和安全验证的多种技术,为用户提供了一种既安全又友好的验证方式。下面我们将深入探讨这个主题。 首先,验证码的核心是生成随机的算数运算表达式。...

    Java随机生成六位验证码

    随机验证码。 - 随机生成十组六位字符组成的验证码。 - 验证码由大小写字母、数字字符组成。

    java生成随机验证码

    java生成随机验证码, 这是一个demo, eclipse项目,导入eclipse即可

    java 生成图片验证码

    在IT领域,验证码(CAPTCHA)是一...在提供的压缩包文件“图片验证码生成”中,可能包含了实现上述功能的源代码示例,你可以通过学习和理解这些代码,加深对Java生成图片验证码的理解,并根据实际需求进行调整和优化。

    java生成验证码的参考资料(中英文验证码)

    本参考资料主要围绕Java生成中英文验证码展开,旨在帮助开发者理解并实现验证码功能。 首先,验证码的生成通常涉及到以下几个关键步骤: 1. **随机字符生成**:验证码由一组随机字符组成,可以是数字、字母,也...

    java 生成动态gif 验证码

    - **绘制图像**:使用Java的`Graphics2D`类在内存中创建一个新的GIF图像,并在其上绘制验证码字符串。可以调整字体、颜色、角度等属性增加难度。 - **添加干扰元素**:为了提高安全性,通常会添加一些随机的线条、...

    java随机生成验证码

    验证码(CAPTCHA)是一种用于验证用户是否为人类的自动化测试技术。...以上就是使用Java生成验证码的基本流程和关键知识点。通过调整各种参数和细节,可以根据实际需求定制出更复杂、更难被机器识别的验证码系统。

    java生成验证码demo

    这个"java生成验证码demo"提供了生成自定义验证码图片的方法,包括设置图片尺寸、验证码长度,以及添加各种视觉混淆元素,以增加机器识别的难度。 首先,我们要理解验证码的基本原理。它通常由一组随机生成的字母或...

    java随机生成数字 验证码

    ### 使用Java生成随机数字和验证码 #### 1. 导入必要包 在文件的部分内容中,可以看到以下导入语句: ```java import java.security.NoSuchAlgorithmException; import java.security.NoSuchProviderException; ...

    java生成的随机验证码

    验证码是网络应用中常见的一种安全机制,用于防止自动...总的来说,Java生成随机验证码的过程涵盖了随机数生成、字符串处理、图像处理等多个编程领域。通过合理的设计和实现,可以创建出既安全又用户友好的验证码系统。

    java生成随机加减法的图形验证码

    本话题主要关注如何使用Java生成包含随机加减法问题的图形验证码。这种验证码不仅增加了安全性,还为用户提供了验证他们是否为人类的互动方式。 首先,`IdentifyingCode.java`可能是一个类,它代表验证码对象,包含...

    验证码生成工具类

    2. **生成图像**:使用Java的`java.awt`和`javax.imageio`包来创建和操作图像。创建一个新的`BufferedImage`对象,然后在画布上绘制随机颜色的背景。接着,用随机角度和位置绘制验证码字符串,可能还会添加一些噪声...

    JAVA动态生成验证码的JAVA实现的代码

    1. **随机生成字符串**:使用`Random`类生成一个随机的字符串,通常包含4到6个字符。可以限制字符集为大小写字母和数字。例如: ```java String characters = ...

    java生成验图片验证码

    Java生成图像验证码涉及到以下几个关键知识点: 1. **随机数生成**:验证码通常由一组随机生成的字符组成,可以是数字、字母或者是两者的混合。Java中的`Random`类可以用于生成随机数,然后结合字符集(如ASCII或...

    java源码:Java验证码生成库 JCaptcha.rar

    3. 创建验证码:在需要生成验证码的控制器方法中,使用JCaptcha的API创建并返回验证码图像。 4. 存储验证码:将生成的验证码字符串存储在session或cookie中,以便后续验证。 5. 验证用户输入:在用户提交表单时,...

    JSP生成数字验证码程序例子

    在这个"JSP生成数字验证码程序例子"中,我们将探讨如何利用JSP来生成一种常见的安全机制——数字验证码。 验证码的主要目的是防止自动化程序(如机器人或爬虫)进行非法操作,比如注册、登录或提交表单。它们通常...

    JAVA实现验证码(完整代码)

    1. 生成随机验证码:使用随机数生成器生成随机验证码,例如使用 Java 的 `Random` 类。 2. 创建图像:使用 Java 的 `BufferedImage` 类创建一个图像,用于显示验证码。 3. 画图:使用 Java 的 `Graphics` 类在图像上...

    Java生成图片验证码

    本文将详细介绍如何使用Java生成图片验证码,并将其应用于前端页面,以及如何进行验证码的校验。 #### 二、关键类与方法 1. **`HttpServlet`**: - `HttpServlet`是Servlet的一个抽象基类,提供了处理HTTP请求的...

Global site tag (gtag.js) - Google Analytics