`
747017186
  • 浏览: 333898 次
社区版块
存档分类
最新评论

Java验证码的生成

 
阅读更多

Java 的生成验证码生成,这里做个总结。

验证码生成的基础类:

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;  
    }  
}     

 下面这个是个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()) ;  
    }  
}  

 在servlet里面配置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> 

 jsp页面的写法:

<style type="text/css">

.xs{

visibility: visible !important;<%--强制性是该样式的优先级变高--%>

}

</style>

<script type="text/javascript">

$().ready(function(){

$('.success').hide();

reflushVerify();//首次进入页面刷新验证码

});

 

//刷新验证码

function reflushVerify(){

var imgsrc='${rootPath}/PictureCheckCode.action?random='+Math.random();//验证码加上随机刷新可以得到不同的验证码,如果不加则验证码不会变化,这一点非常重要,实现局部刷新

$('#JS_captcha').attr("src",imgsrc);

}

</script>

<p id="register_captcha_e">

<label class="tips"><span class="red">*</span>验证码:</label><input type="text" name="captcha" class="register_input verify_input" id="register_captcha" tabindex="14" onblur="validVerify();"/>

<img width="61" height="27" border="0" alt="" id="JS_captcha"/>

<a href="javascript:reflushVerify();" id="JS_captcha_tip" tabindex="15">看不清换一张</a>

<span id="register_ver_s" class="success" style="background-image:     url('./portalpage/login_icon2.png');"></span>

</p>

分享到:
评论

相关推荐

    70.java验证码生成.zip

    70.java验证码生成.zip70.java验证码生成.zip70.java验证码生成.zip70.java验证码生成.zip70.java验证码生成.zip70.java验证码生成.zip70.java验证码生成.zip70.java验证码生成.zip70.java验证码生成.zip70.java...

    java验证码生成类

    这篇博客文章“java验证码生成类”提供了一个简单的示例,下面我们将深入探讨验证码生成的相关知识点。 首先,验证码的基本原理是生成一段随机的、难以由机器识别的文字或数字序列,然后要求用户在限定时间内输入这...

    java验证码生成

    "Java验证码生成"这个主题涵盖了如何在Java环境中创建这种安全功能。以下是对这个话题的详细解释: 验证码通常由一串随机字符组成,这些字符可能是数字、字母或者两者的组合,它们被设计成难以通过计算机程序自动...

    java验证码生成验证

    csdn上三种java验证码生成方法,以及谷歌开源验证码,总共四种验证码生成集合。将生成的四个验证图片放在一个页面上以供比对,全部可以运行。 四种方法分别为: 1. 数字、字母、汉字混合验证码,叠影(给力)、扭曲 ...

    验证码生成工具类

    这个工具类是用Java语言编写的,因此我们可以深入探讨一下Java验证码生成的相关技术和实现。 验证码(CAPTCHA,Completely Automated Public Turing test to tell Computers and Humans Apart)的主要目标是区分...

    Java验证码生成库 JCaptcha

    Java验证码生成库 JCaptcha

    Jcaptcha(java验证码生成框架)使用说明(原创)

    Jcaptcha(Java 验证码生成框架)使用说明 一、框架概述 Jcaptcha 是一个 Java 验证码生成框架,提供了详细的说明及例程,通过调查实践后,总结的,希望对大家有帮助。该框架提供了生成验证码图像通用解决办法,...

    java验证码生成,数字+字母

    java验证码生成,数字+字母 史上最牛逼的验证码,很好用的,不信试试。

    JAVA源码Java验证码生成库JCaptcha

    JAVA源码Java验证码生成库JCaptcha

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

    Java验证码生成库JCaptcha是一个广泛使用的开源项目,用于在Web应用程序中生成安全的、难以破解的验证码。这个库是用Java编写的,旨在提供一种可靠的方法来防止自动化的机器人或恶意脚本对网站进行非法操作,如批量...

    checkcode java验证码生成包

    checkcode(验证码) java验证码生成包

    java资源Java验证码生成库JCaptcha

    java资源Java验证码生成库 JCaptcha提取方式是百度网盘分享地址

    Java验证码生成库 JCaptcha.7z

    Java验证码生成库JCaptcha是一个广泛使用的工具,用于创建安全、动态的图像验证码,旨在防止自动化的机器人或恶意软件对Web应用程序进行未经授权的访问。在Java开发中,验证码是一种常见的安全措施,用来验证用户...

    Java验证码生成器.rar

    用Java写了一个4位(可多位)验证码生成器,封装在一个类里,只需调用一个方法,写入生成图片的类型和生成图片路径,可直接生成验证码,并返回验证码信息。 最简单的使用方法:解压包后,进入captcha文件夹,双击...

    Java生成图片验证码工具类源码

    该工具类使用随机字符生成验证码,并支持自定义验证码长度和字体样式。生成的验证码图片背景透明,线条清晰,可轻松辨认。本源码包含了工具类源码及调用示例,可供开发者参考使用,集成到您的项目中。

    java验证码生成代码

    java中验证码的生成代码工具类,/** * 验证码生成工具类! */

    验证码的生成工具 Java

    总之,这个Java验证码生成工具是一个实用的开发资源,它可以帮助开发者快速构建自己的验证码系统,同时也能为研究验证码识别技术提供实验平台。通过学习和理解这个工具的实现原理,开发者可以深入理解验证码的安全...

    java登录验证码生成代码

    一个登录验证生成验证码用struts 后台生成验证码在jsp页面输出生成图片

Global site tag (gtag.js) - Google Analytics