java验证码开发示例

简介: java验证码开发示例


验证码是一种区分用户是计算机还是人的公共全自动程序;可以防止恶意破解密码、刷票、论坛灌水、刷页、恶意注册、登录。

直接上代码

public static void main(String[] args) throws IOException {

    Random rand = new Random();
    //画板
    BufferedImage i = new BufferedImage(200, 100, 1);
    //画笔
    var m = i.createGraphics();
    //平滑度
    m.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_GASP);
    m.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
    m.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_DEFAULT);
    m.setColor(new Color(rand.nextInt(255), rand.nextInt(255), rand.nextInt(255), rand.nextInt(150, 200)));
    m.fillRect(0, 0, 200, 100);
    Font font = new Font("宋体", Font.BOLD, 50);
    m.setFont(font);
    var fm = m.getFontMetrics(font);
    //验证字符
    String setter = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
    StringBuilder sb = new StringBuilder();
    //生成随机验证码
    for (int j = 0; j < 6; j++) {
        //随机颜色
        m.setColor(new Color(rand.nextInt(120, 255), rand.nextInt(120, 255), rand.nextInt(120, 255), 255));
        int x = j * 30 + 10;
        //验证字符位置
        int y1 = i.getHeight() / 2 + (fm.getAscent() - fm.getDescent()) / 2 - fm.getHeight() / 3;
        int y2 = i.getHeight() / 2 + (fm.getAscent() - fm.getDescent()) / 2 + fm.getHeight() / 3;
        int a = rand.nextInt(setter.length());
        font.deriveFont(rand.nextInt(45, 55));
        var s = setter.substring(a, a + 1);
        m.drawString(s, x, rand.nextInt(y1, y2));
        sb.append(s);
    }

    //验证码干扰
    for (int j = 0; j < 10; j++) {
        m.setColor(new Color(rand.nextInt(255), rand.nextInt(255), rand.nextInt(255), rand.nextInt(50, 120)));
        int a = rand.nextInt(setter.length());
        var s = setter.substring(a, a + 1);
        m.drawString(s, rand.nextInt(10, 190), rand.nextInt(10, 90));
    }

    for (int j = 0; j < 3; j++) {
        m.setColor(new Color(rand.nextInt(255), rand.nextInt(255), rand.nextInt(255), rand.nextInt(100, 200)));
        m.setStroke(new BasicStroke(3));
        m.drawLine(rand.nextInt(10, 20), rand.nextInt(20, 90), rand.nextInt(170, 190), rand.nextInt(20, 90));

    }
    //曲线干扰
    Point[] points = {new Point(0, 0), new Point(0, rand.nextInt(100)), new Point(200, rand.nextInt(100))

    };

    GeneralPath path = new GeneralPath();
    path.moveTo(points[0].x, points[0].y);
    for (int i2 = 0; i2 < points.length - 1; ++i2) {
        Point sp = points[i2];
        Point ep = points[i2 + 1];
        Point c1 = new Point((sp.x + ep.x) / 2, sp.y);
        Point c2 = new Point((sp.x + ep.x) / 2, ep.y);
        path.curveTo(c1.x, c1.y, c2.x, c2.y, ep.x, ep.y);
    }

    // g.draw(path);
    for (int n = 0; n <= 355; n += 10) {
        // g.drawArc(100, 200, 600, 300, n, 5);
    }

    int yy = 100;// y
    int hh = 100;// 高度
    int aa = 200;//
    // x
    for (int x = 10; x < 200; x += 15) {
        int y = (int) (yy + hh * Math.sin(x * Math.PI / aa));
        //g.drawLine(x, (int) y, x, (int) y);
        m.fillOval(x, y, 6, 6);
    }

    m.dispose();
    ImageIO.write(i, "jpg", new File("yanzheng.jpg"));
    Runtime.getRuntime().exec("cmd /k start yanzheng.jpg");

}

目录
相关文章
|
17天前
|
Java
Java开发实现图片URL地址检验,如何编码?
【10月更文挑战第14天】Java开发实现图片URL地址检验,如何编码?
46 4
|
12天前
|
存储 Java
Java中的HashMap和TreeMap,通过具体示例展示了它们在处理复杂数据结构问题时的应用。
【10月更文挑战第19天】本文详细介绍了Java中的HashMap和TreeMap,通过具体示例展示了它们在处理复杂数据结构问题时的应用。HashMap以其高效的插入、查找和删除操作著称,而TreeMap则擅长于保持元素的自然排序或自定义排序,两者各具优势,适用于不同的开发场景。
23 1
|
16天前
|
监控 Java 测试技术
Java开发现在比较缺少什么工具?
【10月更文挑战第15天】Java开发现在比较缺少什么工具?
30 1
|
17天前
|
Java
Java开发实现图片地址检验,如果无法找到资源则使用默认图片,如何编码?
【10月更文挑战第14天】Java开发实现图片地址检验,如果无法找到资源则使用默认图片,如何编码?
49 2
|
9天前
|
开发框架 JavaScript 前端开发
HarmonyOS UI开发:掌握ArkUI(包括Java UI和JS UI)进行界面开发
【10月更文挑战第22天】随着科技发展,操作系统呈现多元化趋势。华为推出的HarmonyOS以其全场景、多设备特性备受关注。本文介绍HarmonyOS的UI开发框架ArkUI,探讨Java UI和JS UI两种开发方式。Java UI适合复杂界面开发,性能较高;JS UI适合快速开发简单界面,跨平台性好。掌握ArkUI可高效打造符合用户需求的界面。
47 8
|
24天前
|
存储 缓存 Java
java基础:IO流 理论与代码示例(详解、idea设置统一utf-8编码问题)
这篇文章详细介绍了Java中的IO流,包括字符与字节的概念、编码格式、File类的使用、IO流的分类和原理,以及通过代码示例展示了各种流的应用,如节点流、处理流、缓存流、转换流、对象流和随机访问文件流。同时,还探讨了IDEA中设置项目编码格式的方法,以及如何处理序列化和反序列化问题。
57 1
java基础:IO流 理论与代码示例(详解、idea设置统一utf-8编码问题)
|
4天前
|
SQL Java 程序员
倍增 Java 程序员的开发效率
应用计算困境:Java 作为主流开发语言,在数据处理方面存在复杂度高的问题,而 SQL 虽然简洁但受限于数据库架构。SPL(Structured Process Language)是一种纯 Java 开发的数据处理语言,结合了 Java 的架构灵活性和 SQL 的简洁性。SPL 提供简洁的语法、完善的计算能力、高效的 IDE、大数据支持、与 Java 应用无缝集成以及开放性和热切换特性,能够大幅提升开发效率和性能。
|
5天前
|
存储 Java 关系型数据库
在Java开发中,数据库连接是应用与数据交互的关键环节。本文通过案例分析,深入探讨Java连接池的原理与最佳实践
在Java开发中,数据库连接是应用与数据交互的关键环节。本文通过案例分析,深入探讨Java连接池的原理与最佳实践,包括连接创建、分配、复用和释放等操作,并通过电商应用实例展示了如何选择合适的连接池库(如HikariCP)和配置参数,实现高效、稳定的数据库连接管理。
16 2
|
5天前
|
监控 Java 数据库连接
在Java开发中,数据库连接管理是关键问题之一
在Java开发中,数据库连接管理是关键问题之一。本文介绍了连接池技术如何通过预创建和管理数据库连接,提高数据库操作的性能和稳定性,减少资源消耗,并简化连接管理。通过示例代码展示了HikariCP连接池的实际应用。
10 1
|
13天前
|
Java 大数据 API
别死脑筋,赶紧学起来!Java之Steam() API 常用方法使用,让开发简单起来!
分享Java Stream API的常用方法,让开发更简单。涵盖filter、map、sorted等操作,提高代码效率与可读性。关注公众号,了解更多技术内容。