java基础---->验证码的使用

  验证码是一种区分用户是计算机和人的公共全自动程序。可以防止:恶意破解密码、刷票、论坛灌水,有效防止某个黑客对某一个特定注册用户用特定程序暴力破解方式进行不断的登陆尝试,实际上是用验证码是现在很多网站通行的方式(比如招商银行的网上个人银行,百度社区),我们利用比较简易的方式实现了这个功能。今天我们就用Java实现一个简单的验证码程序。

用Java实现的验证码程序

生成验证码的步骤:

  1. 定义BufferedImage对象: new BufferedImage(68, 22, BufferedImage.TYPE_INT_RGB);
  2. 获得Graphics对象:         bufferedImage.getGraphics();
  3. 通过Random产生随机验证码信息
  4. 使用Graphics绘制图片
  5. 记录验证码信息到session中
  6. 使用ImageIO输出图片

验证码校验的步骤:

  1. 获取页面验证码
  2. 获取session保存的验证码
  3. 比较验证码
  4. 返回校验结果

我们创建一个Java的Web项目,目结构如下:

一、 定义一个index.jsp,用于刷新验证码、校验验证码不能为空和以及提交验证码:

<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Insert title here</title>
<script type="text/javascript">
    function reload() {
        var time = new Date().getTime();
        document.getElementById("image").src = "<%=request.getContextPath() %>/servlet/ImageServlet?id=" + time;
    };

    function doIt() {
        var code = document.getElementById("code").value;
        if (code == null || code == "") {
            alert("验证码不能为空!");
            return false;
        } else {
            return true;
        }
    };
</script>
</head>
<body>
<form action="servlet/LoginServlet" method="get" onsubmit="return doIt();">
    验证码:<input type="text" name="codeCheck" id="code">
    <img id="image" alt="输入验证码" src="<%=request.getContextPath() %>/servlet/ImageServlet" />
    <a href="javascript: reload();">看不清</a><br>
    <input type="submit" value="submit">
</form>
</body>
</html>

二、 ImageServlet.java,用于生成验证码图片并保存验证码到session中:

package com.huhx.servlet;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;

import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * @author huhx
 */
@WebServlet("/servlet/ImageServlet")
public class ImageServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        BufferedImage bufferedImage = new BufferedImage(68, 22, BufferedImage.TYPE_INT_RGB);
        Graphics graphics = bufferedImage.getGraphics();
        Color color = new Color(225, 230, 246);
        graphics.setColor(color);
        graphics.fillRect(0, 0, 68, 22);

        char[] chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789".toCharArray();
        Random random = new Random();
        int length = chars.length;
        StringBuffer buffer = new StringBuffer();
        int index;
        for (int i = 0; i < 4; i++) {
            index = random.nextInt(length);
            graphics.setColor(new Color(random.nextInt(88), random.nextInt(188), random.nextInt(255)));
            graphics.drawString(chars[index] + "", (i * 15) + 3, 18);
            buffer.append(chars[index]);
        }
        request.getSession().setAttribute("code", buffer.toString());
        ImageIO.write(bufferedImage, "JPG", response.getOutputStream());
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }
}

三、 LoginServlet.java,用于接收用户的验证码提交并验证:

package com.huhx.servlet;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * @author huhx
 */
@WebServlet("/servlet/LoginServlet")
public class LoginServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String codeCheck = request.getParameter("codeCheck");
        String raelCode = (String) request.getSession().getAttribute("code");

        response.setContentType("text/html;charset=utf-8");
        PrintWriter out = response.getWriter();
        if (codeCheck.toUpperCase().equals(raelCode.toUpperCase())) {
            out.println("验证码成功!");
        } else {
            out.println("验证码失败!");
        }
        out.flush();
        out.close();
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }
}

注意:eclipse用的是@WebServlet注解的方式,如果是其他的方式,则servlet需要在web.xml中定义映射关系。

四、 运行结果如下:

其他的验证码框架:kaptcha, jcaptcha,有兴趣的可以关注一下。

时间: 2024-09-28 21:43:53

java基础---->验证码的使用的相关文章

Java基础部分

Java基础部分(直说重点部分)  1."=="和 equals 方法究竟有什么区别? ==如果判断值类型的话,判断内容是否相同.如果判断引用类型则是判断内存地址是否相同  2.静态变量和实例变量的区别?  静态变量使用时,通过类名.名称,实例变量必须要初始化后才能使用.实例变量是实例化后才会分配空间,而静态变量当类加载时会分配空间. 3.是否可以从一个 static 方法内部发出对非 static 方法的调用? 非static方法可以访问static方法. static方法不能访问非

java基础(三章)

java基础(三章) 一.基本if结构 1.流程图 l  输入输出 l  判断和分支 l  流程线 1.1              简单的if条件判断 if(表达式){            //表达式为true,执行{}中的代码 } 1.2              简单的if条件判断 if(表达式){            //表达式为true,执行这里 }else{            //表达式为false,这行这里 } 说明:如果if或else后面,有且仅有一行代码,{ }可以省略

-Java基础-Java介绍

声明:本栏目所使用的素材都是凯哥学堂VIP学员所写,学员有权匿名,对文章有最终解释权:凯哥学堂旨在促进VIP学员互相学习的基础上公开笔记. java的介绍 1.1java简介 Java是一种可以撰写跨平台应用程序的面向对象的程序设计语言. 它最初被命名为Oak,目标设定在家用电器等小型系统的编程语言,来解决诸如电视机.电话.闹钟.烤面包机等家用电器的控制和通讯问题.由于这些智能化家电的市场需求没有预期的高,Sun放弃了该项计划.就在Oak几近失败之时,随着互联网的发展,Sun看到了Oak在计算机

第3篇-JAVA基础

第3篇-JAVA基础 每篇一句 :目标是给梦想一个期限,行动与坚持就是实现梦想的过程 初学心得: 遇到困难或问题,它不是休止符,而是引向你如何解决问题的标识 (笔者:JEEP/711)[JAVA笔记 | 时间:2017-03-26| JAVA基础 Ⅱ] 上篇回顾 上篇文章中我们学习了JAVA底层的运行机制与深入剖析以及解释其中JAVA基础代码的含义 本篇文章将JAVA基础Ⅱ全面剖析解释,因为JAVA基础非常重要,务必要牢记知识点!!! 1.JAVA基础语法格式 JAVA采用unicode编码 1

Java基础学习第五天——方法与数组

文档版本 开发工具 测试平台 工程名字 日期 作者 备注 V1.0 2016.02.24 lutianfei none 第三章Java基础语法 方法 方法就是完成特定功能的代码块,即函数. 格式: 修饰符 返回值类型 方法名(参数类型 参数名1,参数类型 参数名2-) { 函数体; return 返回值; } 详细解释: 修饰符,目前就用public static,后详解. 返回值类型:就是功能结果的数据类型. 方法名:符合命名规则即可,方便我们的调用. 参数: 实际参数:就是实际参与运算的.

2.35 Java基础总结①抽象②接口③设计抽象类和接口的原则④接口和抽象类的区别

java基础总结①抽象②接口③设计抽象类和接口的原则④接口和抽象类的区别 一.抽象 abstract作用:不能产生对象,充当父类,强制子类正确实现重写方法和类相比仅有的改变是不能产生对象,其他的都有,包括构造.属性等等任何一个类只要有一个抽象的方法就成了抽象类 抽象方法 public abstract A();①方法是抽象的,这个类也是抽象的:②子类必须重写抽象方法,除非子类也是抽象类 抽象类可以没有抽象方法,但一般不这么设计 二.接口 interface 接口也是Java的一种引用数据类型(J

java基础 计算今天距本月最后一天还剩多少天

Calendar  c = new GregorianCalendar();   //GregorianCalendar 是Calendar的一个具体子类,提供了世界上大多数国家/地区使用的标准日历系统. GredorianCalendar 是一种混合日历,可由调用者通过调用setGregorianChange()来更改起始日期. Calendar c = new  Calendar.getInstance(TimeZone.getTimeZone("GMT+08:OO"));  //

Java基础语法

Java的基础语法中包含字符集.标识符和关键字.变量和常量.语句.注释.运算符和表达式这些基本要素. 一.关键字 编程语言都有一些保留的单词,用于定义该语言,这些单词对于编译器有特殊含义,不能作为标识符使用: Java中的true.false.null这三个保留字,不能作为标识符使用,对于编译器有特殊含义: main是一个用于描述Java程序开始方法的特殊名称,它不是一个关键字: abstract 抽象 boolean 逻辑运算: 布尔 break 打破: 断开 byte 字节: case 例,

JAVA基础——重新认识String字符串

深入剖析Java之String字符串 在程序开发中字符串无处不在,如用户登陆时输入的用户名.密码等使用的就是字符串. 在 Java 中,字符串被作为 String 类型的对象处理. String 类位于 java.lang 包中.默认情况下,该包被自动导入所有的程序. 创建 String 对象有三种方法 String s1="我是字符串1"; String s2=new String();//创建一个空的字符串对象 String s3=new String("我是字符串2&q