`
hejiajunsh
  • 浏览: 412031 次
  • 性别: Icon_minigender_1
  • 来自: 天津
社区版块
存档分类
最新评论

动手实现随机验证码

 
阅读更多

见过好几种类型的验证码,一开始觉得验证码的生成很神奇,后来发现验证码也是可以用Java轻松实现的。今天就来做一做这件事情。

首先,来写一个画验证码图片的Java类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
package com.xxx.validationCode;
 
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Random;
 
import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
public class ValidationCode extends HttpServlet{
     
    public static String getValidationCodes(OutputStream os){
        char codeTable[]={
                'a','b','c','d','e','f','g','h','i','j','k','l',
                'm','n','p','q','r','s','t','u','v','w','x','y','z',
                'A','B','C','D','E','F','G','H','I','J','K','L',
                'M','N','P','Q','R','S','T','U','V','W','X','Y','Z',
                '1','2','3','4','5','6','7','8','9'
            };    //判断时大小写不区分,另外,没有使用'O'和'0',也是怕混淆的麻烦   
         
        BufferedImage image = new BufferedImage(60, 20,
                                    BufferedImage.TYPE_INT_RGB);
        //生成60×20的RGB图片
        Graphics graphic = image.getGraphics();
        //背景色
        graphic.setColor(new Color(0xDCDCDC));
        graphic.fillRect(0, 0, 60, 20);
         
        char codes[] = new char[4];
        //随机产生验证码
        for(int i=0; i<=3; i++) {
            codes[i] = codeTable[(int)(codeTable.length*Math.random())];
        }
         
        //把字画上去
        graphic.setColor(Color.BLACK);
        graphic.setFont(new Font("Arial", Font.BOLD, 16));
        for(int i=0; i<=3; i++){
            graphic.drawChars(codes, i, 1, 2+15*i, 15+i);
            //把codes[i]画到坐标为[10+5*i,15+i]的地方去
        }
         
        //15个干扰点
        Random rand = new Random();
        for (int i=0;i<15;i++)
            graphic.drawOval(rand.nextInt(60),rand.nextInt(20),1,1);
         
        //释放此图形的上下文并释放它所使用的所有系统资源
        graphic.dispose();
         
        try {
            ImageIO.write(image, "JPEG", os);
        } catch (IOException e) {
            e.printStackTrace();
        }
         
        return new String(codes,0,codes.length);
    }
 
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doPost(request,response);
    }
 
    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        request.getSession().setAttribute("validationCodes", getValidationCodes(response.getOutputStream()));
    }
     
}

然后,写一个Servlet将生成的图片写入页面:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package com.xxx.servlet;
 
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
import com.xxx.validationCode.ValidationCode;
 
public class ValidationServlet extends HttpServlet {
 
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doPost(request,response);
    }
 
    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        String str = ValidationCode.getValidationCodes(response.getOutputStream());
        request.getSession().setAttribute("validationCodes", str);
    }
 
}

接着,在login.jsp中加入如下表单:

1
2
3
4
5
6
7
8
9
10
11
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
 
<form action="<%=basePath+"servlet/LoginServlet"%>">
    <img src="<%=basePath+"servlet/ValidationServlet"%>"/>
    <br>
    <input type="text" name="codes"/>
    <input type="submit"/>
</form>

再写进行后台判断的Servlet:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
package com.xxx.servlet;
 
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
public class LoginServlet extends HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doPost(request,response);
    }
    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
 
        if(request.getSession().getAttribute("validationCodes").toString().toLowerCase()
                    .equals(request.getParameter("codes").toString().toLowerCase()))
            response.getOutputStream().println("Right!");
        else
            response.getOutputStream().println("Wrong!");
         
    }
 
}

转载自《四火的唠叨》

分享到:
评论

相关推荐

    易语言随机生成验证码源码.rar

    本资源“易语言随机生成验证码源码.rar”是一个包含易语言编写的验证码生成器源代码的压缩包,对于学习易语言以及验证码生成技术的开发者来说非常有价值。 验证码(CAPTCHA)是一种自动识别技术,用于防止恶意...

    易语言验证码图片生成

    验证码图片生成技术是一种常见的安全措施,用于防止自动化程序如机器人或爬虫进行恶意操作,例如在网站注册、登录、发布评论等环节。...通过易语言,初学者也能快速理解验证码的生成原理,并动手实现自己的验证码系统。

    两种可实现的jsp验证码

    本教程将详细讲解如何利用JSP(JavaServer Pages)和JavaScript来实现两种彩色的验证码,这两种方法对于初学者来说非常友好,且易于理解。 首先,我们来了解JSP。JSP是Java的一种Web开发技术,它允许开发者在HTML...

    opencv+python 数字验证码的简单实现.zip

    数字验证码通常由几个随机生成的数字或字母组成,它们被扭曲、旋转、添加噪声,以增加机器识别的难度。在这个项目中,我们将专注于识别简单的数字验证码。 1. **图像预处理**:预处理是图像识别的关键步骤,目的是...

    asp汉字图片验证码

    ASP汉字图片验证码是一种常见的安全验证技术,用于防止自动化程序(如机器人)对网站进行非法操作,如注册、...但了解这种传统的实现方式,有助于理解验证码的工作原理,以及在没有现成解决方案时如何自己动手实现。

    本人收集的C#登录验证码生成_有三个样式

    本资源集合包含了三个不同样式的C#验证码生成器,对于学习和理解验证码的实现原理以及C#编程实践具有很高的价值。 样式一的验证码生成器通常会涉及以下几个关键技术点: 1. **随机数生成**:验证码的每个字符通常...

    易语言源码易语言网络神兽验证码模块.rar

    易语言是一种专为初学者设计的编程语言,它采用了贴近自然语言的语法,使得编程变得更加简单易懂。...同时,对于想要了解易语言的初学者来说,这是一个很好的实践项目,可以动手尝试并理解每个部分的实现原理。

    validpic.rar_识别 验证码_验证码_验证码 识别

    验证码是一种人机交互验证机制,它通过生成一组随机字符(数字、字母或符号)并扭曲、遮挡、添加噪声等方式使其难以被机器自动解析,但人类肉眼仍能轻松识别。这样可以区分出真实的人类用户和计算机程序。 2. **...

    ASP.NET验证码的做法

    了解这些文件的作用,可以帮助初学者更好地理解ASP.NET验证码的实现过程,并能动手实践自己的验证码系统。在实际项目中,还需要考虑性能、可用性以及可访问性等因素,确保验证码既有效又对用户友好。

    C# 验证码含源代码

    验证码的核心功能包括生成随机字符或数字组合、图像扭曲、添加噪点等,目的是使计算机难以自动识别,但人类可以轻易辨别。在这个C#源码中,我们可以学习到以下关键知识点: 1. **随机数生成**:验证码通常由随机...

    验证码识别

    在本项目中,我们探讨的是一个基于C#编程语言实现的验证码识别系统,该系统据称具有较高的识别率,适合学习和研究。 首先,我们要了解验证码的基本原理。验证码(CAPTCHA)是“Completely Automated Public Turing ...

    C++ 调用 lua生成验证码图片 简单控制台程序(vs2008编译)

    生成验证码图片的过程包括:生成随机字符串、绘制文本、添加噪声点、扭曲线条等步骤,最后输出为PNG或其他图像格式。 4. **控制台程序**: 本项目采用控制台程序的形式,这意味着用户界面非常简单,主要通过命令行...

    基于深度学习的银行验证码OCR识别算法实现和数据集.zip

    银行验证码通常包含一串随机生成的数字或字母,用于防止自动化系统进行恶意操作。它们增加了用户交互的安全性,但同时也需要OCR技术来自动处理和解码,以便在某些场景下提高效率。 **数据集** 数据集是训练深度学习...

    php验证码实现代码(3种)

    【PHP验证码实现详解】 验证码是一种常用的防止自动化程序恶意操作的安全机制,它要求用户输入图片上显示的一串字符或数字以证明他们是人类用户而非机器人。在本文中,我们将深入探讨如何使用PHP来创建一个简单的纯...

    C#.NET做的验证码

    验证码(CAPTCHA)是一种用于验证用户是否为人类的技术,常用于网页表单提交,防止自动化的机器人或恶意软件进行操作。...通过理解并动手实践这些代码,你可以更好地掌握C#.NET和GDI+在创建验证码中的应用。

    WinForm验证码源码--(201903)

    - 随机字符生成:验证码通常由一组随机的字母或数字组成,源码中可能会有一个方法用于生成这些随机字符串,可能结合了C#的`Random`类和ASCII编码。 - 图形绘制:验证码字符会以扭曲、旋转或变形的方式绘制在图像上...

    深度神经网络训练验证码识别模型学习.zip

    验证码识别是一个典型的计算机视觉问题,其目标是训练模型来识别由随机字符组成的图片。在这个过程中,深度学习模型如卷积神经网络(CNN)通常被用于提取图像特征,然后通过全连接层进行分类。以下是对这个主题的...

    简易登录源码(包含用户名,密码,验证码)

    验证码是一种防止恶意自动提交的安全机制,通常会生成一个随机图像和字符串,用户需要正确输入才能完成登录。这个Servlet可能负责生成验证码,并在用户提交时验证其输入是否正确。 2. `IndexServlet.java`:这通常...

    基于深度学习的12-30-6验证码识别.zip

    在实现这个项目时,我们很可能使用Python作为编程语言,因为它有丰富的深度学习库,如TensorFlow、Keras和PyTorch。这些库提供了构建、训练和评估深度学习模型的便捷接口。 综上所述,"基于深度学习的12-30-6验证码...

    Practice_Codes:验证码

    4. **噪声添加**:为了增加安全性,验证码图像通常会添加噪声,这可以通过在图像上随机放置点或小块来实现。 5. **颜色处理**:使用`image/color`包可以创建和操作颜色,为验证码添加背景色、字符色以及噪声色。 6...

Global site tag (gtag.js) - Google Analytics