`

实现动态验证码生成

    博客分类:
  • Web
 
阅读更多

现在网上有很多在用户登陆或注册的时候为了防止程序攻击,加入了动态验证的技术,一般是让用户输入随即生成的验证码来实现。下面是一个用Servlet生成动态验证码的一个实例,可以根据实际需要进行修改。

1、生成动态验证码的Servlet

    /** 验证码图片的宽度  */
    private int width = 90;
    /** 验证码图片的高度 */ 
    private int height = 30;
    /** 验证码字符个数 */
    private int codeCount = 4;
    /** 字符间距  */
    private int x = 0;  
    /** 字体高度  */ 
    private int fontHeight;
    
    private int codeY; 
    
    /** 随机码可生成字符 */
    char[] codeSequence = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J',  
            'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W',  
            'X', 'Y', 'Z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' };
    
	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;
	}

	public int getCodeCount() {
		return codeCount;
	}

	public void setCodeCount(int codeCount) {
		this.codeCount = codeCount;
	}
	
	@Override
	public void execute(Context context) {
		codeY = height - 4;  
		fontHeight = height - 2;
		x = width / (codeCount + 1);  
	        
        // 定义图像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 | Font.BOLD, fontHeight);  
        // 设置字体。  
        g.setFont(font);  
  
        // 画边框。  
        g.setColor(Color.BLACK);  
        g.drawRect(0, 0, width - 1, height - 1);  
  
        // 随机产生160条干扰线,使图象中的认证码不易被其它程序探测到。  
        g.setColor(Color.pink);  
        for (int i = 0; i < 160; 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(36)]);  
            // 产生随机的颜色分量来构造颜色值,这样输出的每位数字的颜色值都将不同。  
            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 - 6, codeY);  
  
            // 将产生的codeCount个随机数组合在一起。  
            randomCode.append(strRand);  
        }  
        // 将四位数字的验证码保存到Session中。  
        WebContext webContext = (WebContext)context;
        HttpSession session = webContext.getRequest().getSession();
          
        session.setAttribute("randomCode", randomCode.toString());  
        HttpServletResponse resp = webContext.getResponse();
        // 禁止图像缓存。  
        resp.setHeader("Pragma", "no-cache");  
        resp.setHeader("Cache-Control", "no-cache");  
        resp.setDateHeader("Expires", 0);  
  
        // 设置响应的类型格式为图片格式  
        resp.setContentType("image/jpeg");  
  
        // 将图像输出到Servlet输出流中。  
        ServletOutputStream sos = null;
		try {
			sos = resp.getOutputStream();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}  
        try {
			ImageIO.write(buffImg, "jpeg", sos);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}  
        try {
			sos.close();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}  
	}

 最后,在JSP页面中加入动态生成的图片验证码.

如: 
<img src="${basePath}/bankPageControl.pageflow?serviceId=CP01-00-M07" id="randomCode" onclick="javascript:changeCode();" title="单击刷新验证码"/>
 src赋值为对应Servlet路径。
这时新的问题来了,如果用户看不清楚这个图片怎么为呢?
对了,就是加入刷新功能.
说两种简单的方法吧:
1.直接点击图片更换验证码:
可用JS脚本,添加如下代码到JSP页面中:
	/**
	 *动态生成验证码
	 */
	function changeCode(){
		$("#randomCode")[0].src = "${basePath}/bankPageControl.pageflow?serviceId=CP01-00-M07&&t="+new Date().getTime();
	}
 
 2.添加文字链接,使其更换:
<a href="javascript:changeCode();">单击刷新验证码</a>  
 最后注意验证Session的时候需要将这个URL设置为允许访问
这时候运行JSP页面,效果出来了。

 
 
  • 大小: 21.1 KB
分享到:
评论

相关推荐

    Java实现动态验证码生成

    Java实现动态验证码生成

    java 生成动态gif 验证码

    在Java开发中,生成动态GIF验证码是一种常见的安全机制,用于防止自动机器人...通过以上步骤,你就可以在Java Web应用中实现一个生成动态GIF验证码的功能。这不仅增强了系统的安全性,也为用户提供了良好的交互体验。

    ASP.NET动态验证码

    在这个例子中,我们将深入探讨ASP.NET如何实现动态验证码的生成与验证。 首先,我们需要创建一个验证码类,这个类将负责生成随机的字符串和对应的图像。在.NET框架中,我们可以利用`Random`类生成随机数字,然后将...

    基于PHP的中文GIF动态验证码生成器的设计与实现 (1).pdf

    基于 PHP 的中文 GIF 动态验证码生成器的设计与实现 本文介绍了基于 PHP 的中文 GIF 动态验证码生成器的设计与实现,旨在解决当前验证码生成器安全性较弱的问题。文章首先介绍了验证码的概念和当前验证码生成器的...

    C#生成动态验证码

    接下来,我们需要实现验证码的验证功能。这通常涉及以下几个方面: 1. **存储验证码**:生成验证码后,将其安全地存储在一个临时会话或Cookie中,以便后续验证。 2. **用户输入**:用户在看到验证码后,需要手动...

    Python实战:团队激励与沟通之动态验证码生成源码

    项目概述:动态验证码生成源码,旨在提升团队激励与沟通效率。 核心技术:本项目主要采用Python...简洁描述:本项目是一个基于Python的动态验证码生成实现,通过多种文件类型的协作,提高了团队的工作效率和沟通体验。

    验证码生成工具类

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

    验证码生成类大全

    - JavaScript中,可以结合Canvas元素生成动态验证码,或者利用WebGL实现更复杂的3D验证码。 4. **验证码服务端与客户端交互**: - 生成验证码时,服务器端创建一个唯一的验证码值,并将其存储在会话(Session)中...

    java实现动态验证码的效果

    Java 实现动态验证码效果是一种常见的安全机制,用于防止自动化脚本或机器人在网站上进行恶意操作,如批量注册、登录等。在这个过程中,我们将探讨如何使用Java语言来创建一个简单的动态验证码系统,主要包括以下几...

    jsp+servlet实现验证码动态生成

    动态生成验证码,并可以将用户输入的验证码和自动生成的进行比对,给出比对的结果

    用servlet实现动态的生成验证码,点击验证码改变,及验证码的校验

    二、动态验证码生成 1. **生成随机字符串**:首先,我们需要创建一个随机的字符串作为验证码。通常这个字符串包含字母和数字,长度可以自定,比如4位。我们可以利用Java的`Random`类和`StringBuilder`生成这个字符串...

    Servlet仿CSDN动态验证码的生成-带数字和字母

    本文主要探讨如何使用Servlet技术来模仿CSDN网站的动态验证码生成过程,其中包括数字和字母的组合,以及加减乘三种运算的实现。 首先,我们要理解Servlet的原理。Servlet是Java EE中的一种服务器端组件,用于扩展...

    C#实现的验证码生成程序

    在本项目中,我们探讨的是一个使用C#编程语言实现的验证码生成程序,它适用于Windows环境,可以方便地集成到各种Web应用程序中。 首先,验证码的生成通常包括以下几个关键步骤: 1. **随机字符生成**:验证码通常...

    JavaScript实现页面动态验证码

    在本主题中,我们将深入探讨如何使用JavaScript实现一个页面动态验证码。验证码的主要目的是防止自动化的机器人程序对网站进行恶意操作,例如批量注册、垃圾评论等。 验证码通常包括一些随机生成的字符或数字,用户...

    jsp servlet 动态验证码

    JSP是Java的一种视图技术,用于生成动态网页。在JSP页面中,开发者可以混合HTML、CSS和Java代码。在本案例中,JSP可能用于生成包含验证码图像的HTML页面。通过在JSP中嵌入Java脚本,我们可以生成随机数字或字母组合...

    图片验证码生成demo

    在本文中,我们将深入探讨验证码的工作原理,以及如何使用编程技术来实现一个图片验证码生成器。 验证码的主要目标是防止自动化程序(如机器人或爬虫)进行恶意操作,如批量注册、刷票或垃圾邮件发送。它们通过要求...

    页面验证码生成器

    在Java中实现验证码生成,通常涉及到以下几个核心知识点: 1. **随机数生成**:验证码中的字符通常是随机选取的。Java提供了`java.util.Random`类,可以生成指定范围内的随机整数。在这个项目中,我们可以根据需求...

    QT实现随机生成验证码

    // 验证码生成 QString generateCode() { QString code; for (int i = 0; i ; ++i) { int index = QRandomGenerator::global()-&gt;generate() % chars.length(); code.append(chars.mid(index, 1)); } return ...

    安卓验证码相关-android本地验证码生成.rar

    本压缩包"安卓验证码相关-android本地验证码生成.rar"包含了一些关于在Android平台上实现本地验证码生成的源码和资料。下面将详细介绍验证码的原理以及如何在Android中实现。 验证码的原理: 验证码是一种“全自动...

Global site tag (gtag.js) - Google Analytics