`
newbee_zc
  • 浏览: 29906 次
文章分类
社区版块
存档分类
最新评论

java 图形验证码实现案例

阅读更多
  • 后台生成验证码部分
package com.jr.p2p.login.rest;
import java.awt.Color;        
import java.awt.Font;        
import java.awt.Graphics2D;        
import java.awt.image.BufferedImage;        
import java.util.Random;        

import javax.imageio.ImageIO;        
import javax.servlet.ServletException;        
import javax.servlet.ServletOutputStream;        
import javax.servlet.http.HttpServlet;        
import javax.servlet.http.HttpServletRequest;        
import javax.servlet.http.HttpServletResponse;        
import javax.servlet.http.HttpSession; 

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class ValidateCodeController extends HttpServlet {
	
	private static final long serialVersionUID = 1L;
  // 验证码图片的宽度。        
    private int width = 50;        
    // 验证码图片的高度。        
    private int height = 20;        
    // 验证码字符个数        
    private int codeCount = 4;        
    private int x = 0;        
    // 字体高度        
    private int fontHeight;        
    private int codeY;        
    char[] codeSequence = {'1', '2', '3', '4', '5', '6', '7', '8', '9' };
    
    
    @RequestMapping(value="verifyCode",method=RequestMethod.GET)
    public void service(HttpServletRequest req, HttpServletResponse resp,HttpSession session)        
            throws ServletException, java.io.IOException {
        initImage();
        // 定义图像buffer        
        BufferedImage buffImg = new BufferedImage(width, height,        
                BufferedImage.TYPE_INT_RGB);        
        Graphics2D g = buffImg.createGraphics();        
        // 创建一个随机数生成器类        
        Random random = new Random();        
        // 将图像填充为白色        
        g.setColor(Color.WHITE);        
        g.fillRect(0, 0, width, height);        
        // 创建字体,字体的大小应该根据图片的高度来定。        
        Font font = new Font("Fixedsys", Font.PLAIN, fontHeight);        
        // 设置字体。        
        g.setFont(font);        
        // 画边框。        
        g.setColor(Color.LIGHT_GRAY);        
        g.drawRect(0, 0, width - 1, height - 1);        
        // 随机产生10条干扰线,使图象中的认证码不易被其它程序探测到。        
        g.setColor(Color.BLACK);        
        for (int i = 0; i < 10; 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);        
        }        
        // randomCode用于保存随机产生的验证码,以便用户登录后进行验证。        
        StringBuffer randomCode = new StringBuffer();        
        int red = 0, green = 0, blue = 0;        
        // 随机产生codeCount数字的验证码。        
        for (int i = 0; i < codeCount; i++) {        
            // 得到随机产生的验证码数字。        
            String strRand = String.valueOf(codeSequence[random.nextInt(9)]);        
            // 产生随机的颜色分量来构造颜色值,这样输出的每位数字的颜色值都将不同。        
            red = random.nextInt(255);        
            green = random.nextInt(255);        
            blue = random.nextInt(255);        
            // 用随机产生的颜色将验证码绘制到图像中。        
            g.setColor(new Color(red, green, blue));        
            g.drawString(strRand, (i + 1) * x, codeY);        
            // 将产生的四个随机数组合在一起。        
            randomCode.append(strRand);        
        }        
        // 将四位数字的验证码保存到Session中。               
        session.setAttribute("validateCode", randomCode.toString());
        // 禁止图像缓存。        
        resp.setHeader("Pragma", "no-cache");        
        resp.setHeader("Cache-Control", "no-cache");        
        resp.setDateHeader("Expires", 0);        
        resp.setContentType("image/jpeg");        
        // 将图像输出到Servlet输出流中。        
        ServletOutputStream sos = resp.getOutputStream();        
        ImageIO.write(buffImg, "jpeg", sos);        
        sos.close();        
    }
    
    /**
     * 
     * @param inputCode  输入的验证码
     * @return 1:验证码相等   0:验证码不等
     */
    @RequestMapping(value="validateVerifycode",method=RequestMethod.POST)
    public int validateCode(@RequestParam("inputCode")String inputCode,HttpSession session){
    	if(inputCode.equalsIgnoreCase((String)session.getAttribute("validateCode"))){
    		return 1;
    	}else {
			return 0;
		}
    }
    
    /**      
     * 初始化验证图片属性      
     */       
    public void initImage() throws ServletException {        
        // 从web.xml中获取初始信息        
        // 宽度        
        String strWidth ="80";        
        // 高度        
        String strHeight ="30";        
        // 字符个数        
        String strCodeCount = "4";        
        // 将配置的信息转换成数值        
        try {        
            if (strWidth != null && strWidth.length() != 0) {        
                width = Integer.parseInt(strWidth);        
            }        
            if (strHeight != null && strHeight.length() != 0) {        
                height = Integer.parseInt(strHeight);        
            }        
            if (strCodeCount != null && strCodeCount.length() != 0) {        
                codeCount = Integer.parseInt(strCodeCount);        
            }        
        } catch (NumberFormatException e) {        
        }        
        x = width / (codeCount + 2);        
        fontHeight = height - 2;        
        codeY = height - 4;        
    }  
}

 

 

  • 前台获取图形验证码部分
<li id="verifycodeLi">
                <label>验证码</label>
                <input tabindex="3" type="text" id="verifycode" name="verifycode" class="input" maxlength="4" style="width:80px" onblur="checkVerifyCode()" onfocus="hideVerifyCode()">
                <img id="imgverCode" src="/rest/verifyCode" onclick="coderefresh()" width="74" height="42" alt="验证码" title="验证码" class="authcode"> 
				<a href="javascript:void(0)" onclick="coderefresh()" class="refcode r3">
				<i class="icons refresh-todo"></i><b>刷新</b></a> 
                <input type="hidden" id="imgverCodeIsOk" value="">
            </li>

 

 

  • js验证部分
//校验验证码
function checkVerifyCode(){
	var tip = $("#tip");
	var inputCode=$("#verifycode").val();
	jQuery.ajax({
		async : true,
		data : {inputCode: inputCode},
		dataType : "json",
		url : "/rest/validateVerifycode",
		type : "POST",
		success : function(data)
		{
			if(data==0){
				tip.html("验证码不正确!");
		        tipShow();
			}else{
				tipHide();
			}
	        $("#imgverCodeIsOk").val(data);
		}
	});
}

 

分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    Java案例开发锦集

    案例1 用户登录验证的完整程序 案例2 MD5的Javabean实现 案例3 用公钥计算消息摘要的验证码 案例4-1 Java中的数字证书的生成及维护方法 案例4-2 数字证书的签发(签名) 案例4-3 利用数字证书给...

    J2EE经典案例设计与实现

    案例5:创建可重用的图形背景 案例6:发送动态图像 案例7:生成用于投票的图片 案例8:JSP调用JavaBean在网页上动态生成柱状图 案例9:实现图片上传 案例10:JSP页面调用Applet实现人民币大小写转换 本章小结 第4章 ...

    Java中的3D图形技术及应用案例研究

    随着Java技术的不断发展,Java平台下3D图形应用的性能有了极大的提高,结合Java开发原有的优势,越来越多的...本文介绍和分析了Java平台下若干具有代表性的3D图形技术,并在我们的工程案例中使用了其中之一的JME技术。

    JAVA 范例大全 光盘 资源

    实例204 可选择的图形验证码 670 实例205 简单的页面注册 675 实例206 用Servlet实现分页查看数据库 686 实例207 简单的BBS论坛 697 第21章 Java程序综合案例:教务处管理系统 705 21.1 登录界面的设计与代码...

    经典JAVA.EE企业应用实战.基于WEBLOGIC_JBOSS的JSF_EJB3_JPA整合开发.pdf

    该案例采用目前最流行、最规范的java ee架构,整个应用分为jpa实体层、eao层、业务逻辑层、mvc层和视图层,各层之间分层清晰,层与层之间以松耦合的方法组织在一起。该案例既提供了ide无关的、基于ant管理的项目源码...

    java范例开发大全源代码

     实例190 验证码 322  11.3 Date类和Calendar类 324  实例191 使用Date类获取系统的当前时间 324  实例192 使用DateFormat类获取系统的当前时间 325  实例193 使用GregorianCalendar类获取系统的当前...

    JAVA WEB典型模块与项目实战大全

    5.4 实现图形验证码  5.5 避免重复提交功能  5.6 缩略加水印图像  5.7 小结  第6章 网络硬盘  6.1 网络硬盘功能原理  6.2 网络硬盘功能具体实现——浏览磁盘和显示文件信息  6.3 网络硬盘功能具体...

    java范例开发大全

    实例190 验证码 322 11.3 Date类和Calendar类 324 实例191 使用Date类获取系统的当前时间 324 实例192 使用DateFormat类获取系统的当前时间 325 实例193 使用GregorianCalendar类获取系统的当前时间 326 实例194 ...

    Java范例开发大全 (源程序)

     实例190 验证码 322  11.3 Date类和Calendar类 324  实例191 使用Date类获取系统的当前时间 324  实例192 使用DateFormat类获取系统的当前时间 325  实例193 使用GregorianCalendar类获取系统的当前时间 ...

    Java范例开发大全(全书源程序)

    实例190 验证码 322 11.3 Date类和Calendar类 324 实例191 使用Date类获取系统的当前时间 324 实例192 使用DateFormat类获取系统的当前时间 325 实例193 使用GregorianCalendar类获取系统的当前时间 326 实例...

    java范例开发大全(pdf&源码)

    实例190 验证码 322 11.3 Date类和Calendar类 324 实例191 使用Date类获取系统的当前时间 324 实例192 使用DateFormat类获取系统的当前时间 325 实例193 使用GregorianCalendar类获取系统的当前时间 326 实例194 ...

    08-最新HTML5+CSS3+JavaScript实用案例大全(2181例).rar

    4款echarts.js扁平图形统计图表代码4款超酷Tabs选项卡代码 ]4种动态波浪文字动画js特效 ]4种漂亮的CSS3鼠标拖动滑块样式代码15个漂亮的css3单选按钮美化动画代码]5款漂亮的jQuery拖动滑块选值特效5款实用的jQuery...

    asp.net知识库

    HttpModule 实现 ASP.Net (*.aspx) 中文简繁体的自动转换,不用修改原有的任何代码,直接部署即可! 服务器自定义开发二之客户端脚本回发 Web开发: 使用URL重写WEB主题切换 如何在Asp.Net1.1中实现页面模板(所谓的...

Global site tag (gtag.js) - Google Analytics