java实用验证码的实现代码

yizhihongxing

针对“java实用验证码的实现代码”的完整攻略,我将以下面几个部分进行详细讲解:

  1. 验证码介绍:了解什么是验证码以及它的作用。
  2. 验证码实现思路:介绍如何实现验证码的代码。
  3. 验证码实现示例:提供两个示例说明。

1. 验证码介绍

验证码全称为“Completely Automated Public Turing test to tell Computers and Humans Apart”,中文翻译为“全自动区分计算机和人类的图灵测试”,是为了防止恶意攻击、垃圾邮件、机器人等等而产生的一种人机识别技术。实现原理是:生成一张随机的包含数字、字母的图片,要求用户在图片中识别出特定的验证码,如果用户识别正确则算验证通过,否则就需要继续输入验证码,直到正确为止。通过使用验证码,可以有效遏制一些自动化的恶意攻击,提高系统的安全性。

2. 验证码实现思路

以下是验证码实现的思路:

  1. 随机生成字符串:随机生成一组包含数字、字母的字符串,可以通过Java中的Random类实现。
  2. 字符串生成图片:将随机生成的字符串绘制到一张图片上,可以通过Java中的Graphics类实现。
  3. 图片输出:将生成的图片输出到页面上,可以通过response.getOutputStream()实现。
  4. 验证码存储:将生成的验证码字符串保存到Session中,可以通过request.getSession().setAttribute()实现。
  5. 用户输入验证:用户在登录或者注册时输入生成的验证码字符串,通过与Session中存储的验证码字符串进行比对,判断是否通过验证。

3. 验证码实现示例

以下是两个生成验证码的示例。

示例一

public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
    String code = randomCode();//生成随机码
    BufferedImage img = generateImage(code);//生成图片
    HttpSession session = request.getSession();
    session.setAttribute("checkcode", code);//保存随机码到Session中
    response.setContentType("image/png");
    OutputStream os = response.getOutputStream();
    ImageIO.write(img, "png", os);//生成图片输出到磁盘
    os.close();
}

private String randomCode() {
    String str = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
    Random random = new Random();
    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < 4; i++) {
        int index = random.nextInt(str.length());
        sb.append(str.charAt(index));
    }
    return sb.toString();
}

private BufferedImage generateImage(String code) {
    int width = 80;//图片的宽度
    int height = 30;//图片的高度
    BufferedImage img = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
    Graphics g = img.getGraphics();
    g.setColor(Color.WHITE);//设置背景色
    g.fillRect(0, 0, width, height);
    g.setColor(Color.BLACK);//设置字体色
    Font font = new Font("宋体", Font.BOLD, 20);
    g.setFont(font);
    //生成随机字符
    for (int i = 0; i < code.length(); i++) {
        g.drawString(String.valueOf(code.charAt(i)), 20 * i + 8, 22);
    }
    //画干扰线
    Random random = new Random();
    for (int i = 0; i < 6; i++) {
        int x1 = random.nextInt(width);
        int y1 = random.nextInt(height);
        int x2 = random.nextInt(width);
        int y2 = random.nextInt(height);
        g.drawLine(x1, y1, x2, y2);
    }
    g.dispose();
    return img;
}

示例二

public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
    String code = randomCode();//生成随机码
    BufferedImage img = generateImage(code);//生成图片
    HttpSession session = request.getSession();
    session.setAttribute("checkcode", code);//保存随机码到Session中
    response.setContentType("image/png");
    OutputStream os = response.getOutputStream();
    try {
        JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(os);//将图片以JPEG格式输出
        encoder.encode(img);
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        os.flush();
        os.close();
    }
}

private String randomCode() {
    String str = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
    Random random = new Random();
    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < 4; i++) {
        int index = random.nextInt(str.length());
        sb.append(str.charAt(index));
    }
    return sb.toString();
}

private BufferedImage generateImage(String code) {
    int width = 85;//图片的宽度
    int height = 30;//图片的高度
    BufferedImage img = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
    Graphics g = img.getGraphics();
    g.setColor(Color.white);//设置背景色
    g.fillRect(0, 0, width, height);
    g.setColor(Color.BLACK);//设置字体色
    Font font = new Font("楷体", Font.BOLD, 24);
    g.setFont(font);
    //生成随机字符
    for (int i = 0; i < code.length(); i++) {
        g.drawString(String.valueOf(code.charAt(i)), 20 * i + 9, 23);
    }
    //画干扰线
    Random random = new Random();
    for (int i = 0; i < 6; i++) {
        int x1 = random.nextInt(width);
        int y1 = random.nextInt(height);
        int x2 = random.nextInt(width);
        int y2 = random.nextInt(height);
        g.drawLine(x1, y1, x2, y2);
    }
    g.dispose();
    return img;
}

以上是两个生成验证码的示例代码,可以按照需求进行修改和调整。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java实用验证码的实现代码 - Python技术站

(0)
上一篇 2023年5月23日
下一篇 2023年5月23日

相关文章

  • 使用Maven Archetype插件构建Maven工程原型模板的实例

    使用Maven Archetype插件构建Maven工程原型模板的实例, 可以让我们快速搭建出一个符合我们需求的 Maven 工程,本文将介绍使用 Maven Archetype 插件来构建 Maven 工程原型模板的具体步骤。 确认 Maven 环境 首先需确认已经在环境中安装了 Maven。在命令行运行以下指令,如果输出的结果类似与下面的内容就说明 Ma…

    Java 2023年5月20日
    00
  • java Scanner输入数字、字符串过程解析

    接下来我将为您提供关于Java中Scanner输入数字、字符串的详细描述。 Scanner类 Java中的Scanner类提供了一种可以解析基本数据类型和字符串的简便方法。Scanner可以从文件、输入流、文本字符串和其他源读取格式化的输入内容。我们可以使用Scanner进行数字和字符串输入处理。 以下是Scanner类的构造方法: Scanner(Inpu…

    Java 2023年5月27日
    00
  • jsp传值本地无乱码测试机出现乱码问题解决

    下面我将详细讲解“jsp传值本地无乱码测试机出现乱码问题解决”的完整攻略。 一、问题描述 当我们在本地运行jsp页面传输值,并将页面上传至测试机运行时,有时会出现中文乱码的问题。这是因为本地和测试机的编码不一致所造成的。 二、解决方法 配置jsp页面编码方式 在jsp页面中,加入以下代码进行页面编码的设置。以UTF-8编码方式为例: <%@ page …

    Java 2023年6月15日
    00
  • Java中的LinkedList是什么?

    Java中的LinkedList是一种双向链表,它是Java集合框架中提供的一种List接口的实现类。LinkedList提供了许多方便的方法来操作其元素,如添加、删除、查找、遍历等。下面将详细介绍LinkedList的用法。 LinkedList的基本特点 在Java的LinkedList中,每个节点都包含前一个节点、当前节点和后一个节点的引用,因此它支持…

    Java 2023年4月27日
    00
  • 内存泄漏的原因有哪些?

    以下是关于内存泄漏的原因的完整使用攻略: 内存泄漏的原因 内存泄漏是指程序在运行过程中,分配的内存空间没有被及时释放,导致内存间的浪费和程序运行速度的下降。内存泄漏的原因主要有以下几点: 1. 没有及时释内存 在程序中,如果分配了内存空间,就需要在不需要使用这个内存空间时及时释放,否则会致内存泄漏。例如,在 C++ 中,使用 new 运算符分配内存空间时,需…

    Java 2023年5月12日
    00
  • 49个Spring经典面试题总结(附带答案)

    着手准备 首先,要对本文提到的49个Spring相关面试题有一定的了解。 其次,要清楚掌握Spring框架的核心概念和基础知识。 最后,要结合面试框架,将知识点学以致用,深入理解每个问题,适当练习,加深印象,提升答案的质量。 问题类型详解 Bean的定义,作用域、生命周期等问题 解释Spring中Bean的定义,Spring Bean的作用域、生命周期等问题…

    Java 2023年5月20日
    00
  • 什么是类加载的生命周期?

    以下是关于类加载的生命周期的详细讲解: 什么是类加载的生命周期? 类加载的生命周期是指从类被加载到内存中开始,到类被卸载出内存为的整个过程。类加载的生命周期包括以下几个阶段: 加载(Loading):将类的字节码加载到内存。 链接(Linking):将类的二进制数据合并到 Java 运行时环境中。 验证(Verification):验证的字节码是否符合 Ja…

    Java 2023年5月12日
    00
  • SpringBoot集成Beetl后统一处理页面异常的方法

    为了让 SpringBoot 集成 Beetl 后能够统一处理页面异常,需要实现一个全局异常处理器。以下是实现步骤: 1. 引入 Beetl 和 Beetl Spring Boot Starter 在 pom.xml 文件中引入 Beetl 和 Beetl Spring Boot Starter: <dependency> <groupId…

    Java 2023年5月27日
    00
合作推广
合作推广
分享本页
返回顶部